这两种方法有啥区别?是啥让第二个比第一个更好?

Posted

技术标签:

【中文标题】这两种方法有啥区别?是啥让第二个比第一个更好?【英文标题】:What's the difference between the two methods? What makes the second one better than the first one?这两种方法有什么区别?是什么让第二个比第一个更好? 【发布时间】:2012-01-30 11:26:26 【问题描述】:

我有两种方法可以做同样的事情。例如,当我在多个插入中使用它时,第一个会导致性能问题,有时会引发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;

【问题讨论】:

看起来你在重用某种形式的通用连接,OpenConnection();而不是让 .Net 框架管理连接池,即:使用 (Connection connection = new Connection(connString) // db code here 【参考方案1】:

第二种方法将传递给过程的参数作为强类型 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 尝试将字符串转换为正确的数据类型,并使用默认值或查看可用的元数据以找出正确的数据类型其他参数的值(我不记得确切的行为是什么)。

【讨论】:

如果存储过程的参数是int类型,我使用第一种方法Dictionary&lt;string, string&gt; Param_arr,这会导致问题吗?【参考方案2】:

我看到的唯一区别是您处理参数的方式。在第一个示例中,您正在创建它们,而在第二个示例中,它们似乎作为方法的参数之一传递。 这似乎是问题

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

【讨论】:

以上是关于这两种方法有啥区别?是啥让第二个比第一个更好?的主要内容,如果未能解决你的问题,请参考以下文章

这两种方法有啥区别

在C++种,关于指针的这两种表示有啥区别:double * a和double ** a?两个**是啥意思呢?

K均值聚类法和系统聚类法有啥区别,这两种聚类方法的适用条件都是啥?

这两种方法有啥区别?

C ++中这两种强制转换方法有啥区别? [复制]

在 Promise 中,使用 catch 和 then 的第二个参数有啥区别? [复制]