В чем разница между двумя методами?Что делает второй лучше первого? - PullRequest
1 голос
/ 30 января 2012

У меня есть два метода, которые делают то же самое. Первый создает проблемы с производительностью, когда я использую его, например, в нескольких вставках, и иногда выдает исключение Input string was in incorrect format. Второй работает нормально. Я хочу знать, почему этот первый имеет эти проблемы и в чем разница между этими двумя методами.

Первый метод:

public DataTable Return_DataTable(string cmdText, CommandType cmdType, 
    Dictionary<string, string> Param_arr)
{
    Open_Connection();
    int return_val = -1;
    DataTable dt = new DataTable();
    command.CommandText = cmdText;
    command.CommandType = cmdType;
    if (cmdType == CommandType.StoredProcedure)
    {
        if (Param_arr != null)
        {
            command.Parameters.Clear();
            if (Param_arr.Count > 0)
            {
                for (IEnumerator<KeyValuePair<string, string>> enumerator = 
                    Param_arr.GetEnumerator(); enumerator.MoveNext(); )
                {
                    param = command.CreateParameter();
                    param.ParameterName = enumerator.Current.Key.ToString();
                    param.Value = enumerator.Current.Value.ToString();
                    command.Parameters.Add(param);
                }
            }
        }
    }
    IfxDataReader dr2;
    try
    {
        dr2 = command.ExecuteReader();
        dt.Load(dr2);
    }
    catch (IfxException ifxEx)// Handle IBM.data.informix : mostly catched
    {
        ErrMappingForInformix.WriteLog("\r\n Error Code: " + 
            ifxEx.Errors[0].NativeError.ToString() +
            "\r\n MEssage: " + ifxEx.Errors[0].Message);

        throw new Exception("ERROR:" + ifxEx.Errors[0].NativeError.ToString() +
            "\r\n MEssage: " + ifxEx.Errors[0].Message);
    }
    catch (Exception ex)// Handle all other exceptions.
    {
        ErrMappingForInformix.WriteLog("\r\n Error Message: " + ex.Message);
        throw new Exception("\r\n Error Message: " + ex.Message);
    }
    finally
    {
        Close_Connection();
    }
    return dt;
}

Второй метод:

public DataTable Return_DataTable(IfxCommand cmd, CommandType cmdtype, 
    IfxParameter[] parameters)
{
    Open_Connection();
    DataTable dt = new DataTable();
    cmd.CommandText = cmd.CommandText;
    cmd.CommandType = cmdtype;
    cmd.Connection = connection;
    cmd.CommandTimeout = 100;
    for (int j = 0; j < parameters.Length; j++)
    {
        cmd.Parameters.Add(parameters[j]);
    }
    try
    {
        dt.Load(cmd.ExecuteReader());
    }
    catch (IfxException ifxEx)// Handle IBM.data.informix : mostly catched
    {
        ErrMappingForInformix.WriteLog("\r\n Error Code: " + 
            ifxEx.Errors[0].NativeError.ToString() +
            "\r\n MEssage: " + ifxEx.Errors[0].Message);

        throw new Exception("ERROR:" + ifxEx.Errors[0].NativeError.ToString() +
            "\r\n MEssage: " + ifxEx.Errors[0].Message);
    }
    catch (Exception ex)// Handle all other exceptions.
    {
        ErrMappingForInformix.WriteLog("\r\n Error Message: " + ex.Message);
        throw new Exception("\r\n Error Message: " + ex.Message);
    }
    finally
    {
        Close_Connection();
    }
    return dt;
}

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Второй метод обрабатывает параметры, передаваемые в процедуру, как строго типизированные объекты IfxParameter (которые, я предполагаю, наследуются от dbParameter). Первый метод хранит те же данные, что и пара строк, что намного хуже; он содержит меньше метаданных - например, тип данных значения не сохраняется.

Параметр DbDataParameter содержит следующую информацию:

DbType DbType { get; set; }
ParameterDirection Direction { get; set; }
bool IsNullable { get; }
string ParameterName { get; set; }
string SourceColumn { get; set; }
DataRowVersion SourceVersion { get; set; }
object Value { get; set; }
byte Precision { get; set; }
byte Scale { get; set; }
int Size { get; set; }

Первый метод, который предоставляет только имя и строковое представление значения, заставляет ADO.NET пытаться привести строку к правильному типу данных и либо использовать значения по умолчанию, либо просмотреть доступные метаданные, чтобы выяснить правильные значения для других параметров (я точно не помню, каково точное поведение).

2 голосов
/ 30 января 2012

Единственное отличие, которое я вижу, в том, как вы справляетесь с параметрами.В первом примере вы их создаете, а во втором они, похоже, передаются как один из параметров метода.Кажется, это проблема

for (IEnumerator<KeyValuePair<string, string>> enumerator = Param_arr.GetEnumerator(); enumerator.MoveNext(); )
...