C# 什么';这两种方法的区别是什么?是什么让第二个比第一个更好?

C# 什么';这两种方法的区别是什么?是什么让第二个比第一个更好?,c#,asp.net,string,performance,informix,C#,Asp.net,String,Performance,Informix,我有两种方法做同样的事情。例如,当我在多次插入中使用第一个字符串时,会出现性能问题,有时会抛出格式不正确的输入字符串异常。第二个很好用。我想知道为什么第一种方法会有这些问题,以及两种方法之间的区别 第一种方法: public DataTable Return\u DataTable(字符串cmdText,CommandType cmdType, 字典参数(arr) { 打开_连接(); int return_val=-1; DataTable dt=新的DataTable(); command.

我有两种方法做同样的事情。例如,当我在多次插入中使用第一个字符串时,会出现性能问题,有时会抛出格式不正确的
输入字符串
异常。第二个很好用。我想知道为什么第一种方法会有这些问题,以及两种方法之间的区别

第一种方法:
public DataTable Return\u DataTable(字符串cmdText,CommandType cmdType,
字典参数(arr)
{
打开_连接();
int return_val=-1;
DataTable dt=新的DataTable();
command.CommandText=cmdText;
command.CommandType=cmdType;
如果(cmdType==CommandType.StoredProcess)
{
if(参数arr!=null)
{
command.Parameters.Clear();
如果(参数arr.Count>0)
{
对于(IEnumerator枚举器=
参数arr.GetEnumerator();enumerator.MoveNext();)
{
param=command.CreateParameter();
param.ParameterName=枚举数.Current.Key.ToString();
param.Value=enumerator.Current.Value.ToString();
命令.Parameters.Add(param);
}
}
}
}
IfxDataReader dr2;
尝试
{
dr2=command.ExecuteReader();
dt.荷载(dr2);
}
catch(IfxException ifxEx)//Handle IBM.data.informix:大部分被捕获
{
ErrorMappingForInformix.WriteLog(“\r\n错误代码:”+
ifxEx.Errors[0]。NativeError.ToString()+
“\r\n消息:”+ifxEx.Errors[0]。消息);
抛出新异常(“错误:+ifxEx.Errors[0]。NativeError.ToString()+
“\r\n消息:”+ifxEx.Errors[0]。消息);
}
catch(Exception ex)//处理所有其他异常。
{
ErrMappingForInformix.WriteLog(“\r\n错误消息:“+ex.Message”);
抛出新异常(“\r\n错误消息:“+ex.Message”);
}
最后
{
关闭_连接();
}
返回dt;
}

第二种方法:
public DataTable Return\u DataTable(IfxCommand cmd,CommandType cmdtype,
IfxParameter[]参数)
{
打开_连接();
DataTable dt=新的DataTable();
cmd.CommandText=cmd.CommandText;
cmd.CommandType=cmdtype;
cmd.Connection=连接;
cmd.CommandTimeout=100;
对于(int j=0;j
我看到的唯一区别在于处理参数的方式。在第一个示例中,您正在创建它们,而在第二个示例中,它们似乎作为方法的参数之一传递。 这似乎就是问题所在

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

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

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

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

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

看起来你是在重用某种形式的公共连接OpenConnection();而不是让.Net framework管理连接池,即:使用(Connection Connection=new Connection(connString){//db code here}看起来您正在重用某种形式的公共连接OpenConnection();而不是让.Net framework管理连接池,即:使用(Connection Connection=new Connection(connString){//db code here}如果存储过程的参数类型为int,则使用