Как я могу преобразовать это универсальный метод?


У меня есть этот код, который я использовал, чтобы тянуть данные из наших IBM я на .Сетка в объект так легко работать с (без таблицы данных).

  1. Как я могу сделать это лучше?
  2. Как я могу конвертировать все/большинство в универсальный метод многоразовый?

Вот пример метода, я написал:

public Customer GetUtilityBillCustomer(int id)
{
    #region SQL Statement
    StringBuilder sb = new StringBuilder();
    sb.Append("SELECT ACUSTN, AWEBPN, ANAME, AADD1, AADD2, ACITY, ASTATE, AZIP5, AZIP4, AEMADR, ALOCAT, ");
    sb.Append("(TRIM(WTMETER.MADRSN) || ' ' || TRIM(WTMETER.MADRSA) || ' ' || TRIM(WTMETER.MADRSX)) AS SERVICEADDR, ");
    sb.Append("(AARR1 + AARR2 + AARR3) AS BALANCE ");
    sb.Append("FROM WTCUST, WTMETER ");
    sb.Append("WHERE ALOCAT = MLOCAT AND ACUSTN = @custnumber1 ");
    sb.Append("UNION ");
    sb.Append("SELECT FCUSTN, FWEBPN, FNAME, FADD1, FADD2, FCITY, FSTATE, FZIP5, FZIP4, FEMADR, FLOCAT, ");
    sb.Append("(TRIM(WTMETER.MADRSN) || ' ' || TRIM(WTMETER.MADRSA) || ' ' || TRIM(WTMETER.MADRSX)) AS SERVICEADDR, WTFINAL.FAMTDU AS BALANCE ");
    sb.Append("FROM WTFINAL, WTMETER ");
    sb.Append("WHERE FLOCAT = MLOCAT AND FCUSTN = @custnumber2");
    #endregion

    DataTable dt = new DataTable();
    using (iDB2Connection conn = new iDB2Connection(_connString))
    {
        using (iDB2Command cmd = new iDB2Command(sb.ToString(), conn))
        {
            conn.Open();
            cmd.Parameters.Add("@custnumber1", iDB2DbType.iDB2Decimal).Value = id;
            cmd.Parameters.Add("@custnumber2", iDB2DbType.iDB2Decimal).Value = id;
            using (iDB2DataAdapter da = new iDB2DataAdapter(cmd)) { da.Fill(dt); }
            conn.Close();
        }
    }

    #region Fill object from DataTable
    var customer = (from i in dt.AsEnumerable()
                    select new Customer
                    {
                        Id = i.Field<int>("ACUSTN"),
                        Pin = i.Field<int>("AWEBPN"),
                        Name = i.Field<string>("ANAME").Trim(),
                        Address1 = i.Field<string>("AADD1").Trim(),
                        Address2 = i.Field<string>("AADD1").Trim(),
                        City = i.Field<string>("ACITY").Trim(),
                        State = i.Field<string>("ASTATE").Trim(),
                        Zip5 = i.Field<string>("AZIP5").Trim(),
                        Zip4 = i.Field<string>("AZIP4").Trim(),
                        LocationNumber = i.Field<int>("ALOCAT"),
                        ServiceAddress = i.Field<string>("SERVICEADDR").Trim(),
                        BalanceDue = i.Field<decimal>("BALANCE"),
                        Email = i.Field<string>("AEMADR")
                    }).SingleOrDefault();
    #endregion

    return customer;
}

Я думал вдоль линий:

public static DataTable GetData(string connString, string sqlStatement)
{
    DataTable dt = new DataTable();

    using (iDB2Connection conn = new iDB2Connection(connString))
    {
        using (iDB2Command cmd = new iDB2Command(sqlStatement, conn))
        {
            conn.Open();
            cmd.Parameters.Add("@custnumber1", iDB2DbType.iDB2Decimal).Value = id;
            cmd.Parameters.Add("@custnumber2", iDB2DbType.iDB2Decimal).Value = id;
            using (iDB2DataAdapter da = new iDB2DataAdapter(cmd)) { da.Fill(dt); }
            conn.Close();
         }
    }

    return dt;
}

Но как мне пройти в неизвестном список параметров и типы параметров? Я бы использовать массив объектов? Другие мысли?



687
3
c#
задан 9 декабря 2011 в 02:12 Источник Поделиться
Комментарии
2 ответа

Вы можете получить лямбда-выражение, которое добавляет параметры.

public static DataTable GetData(string connString, string sqlStatement, Action<iDB2ParameterCollection> addParameters)
{
DataTable dt = new DataTable();

using (iDB2Connection conn = new iDB2Connection(connString))
{
using (iDB2Command cmd = new iDB2Command(sqlStatement, conn))
{
conn.Open();
if(addParameters != null) {
addParameters(cmd.Parameters);
}
using (iDB2DataAdapter da = new iDB2DataAdapter(cmd)) { da.Fill(dt); }
conn.Close();
}
}

return dt;
}

//...
GetData(connStr, sqlStatement, parameters => {
parameters.Add("@custnumber1", iDB2DbType.iDB2Decimal).Value = id;
parameters.Add("@custnumber2", iDB2DbType.iDB2Decimal).Value = id;
});


Редактировать: я предлагаю читать о разных делегатов: действий; функции; сказуемое.
https://stackoverflow.com/questions/566860/delegates-predicate-action-func

В двух словах:


  • Действие делает что-то;

  • Функ такое же, как действие, но с обратным значением;

  • Сказуемое такой же, как Функ но немного более семантически значимым.

3
ответ дан 9 декабря 2011 в 02:12 Источник Поделиться

Майк,
Вы также можете создать модель сущностей из базы данных и запросов SQL для этого. Основы сущности 4.1 эффективно использует лямбда-выражения, чтобы создать любой тип запроса или даже обновить БД.
Вы можете использовать жадную загрузку, чтобы запросить соответствующие сведения.

Основы сущности книга Джули Лерман является отличным с большим количеством примеров кода.

2
ответ дан 9 декабря 2011 в 05:12 Источник Поделиться