我有一个参数添加函数,如下所示:
public static void AddParameter(DbCommand comm, string ParamName, Object objValue, DbType Paramtype,int paramSize)
{
//comm.Parameters.Clear();
DbParameter param = comm.CreateParameter();
param.ParameterName = ParamName;
param.DbType = Paramtype;
param.Size = paramSize;
param.Direction = ParameterDirection.Input;
param.Value = objValue;
comm.Parameters.Add(param);
}
现在什么时候做以下操作:
conn.Open();
DbCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM tableName WHERE MemberID=@MemberID";
AddParameter(cmd, "@MemberID", "00000970-b1fd-49ad-89fc-1de066c0076c", DbType.String, 50);
cmd.ExecuteReader();
我得到超时异常。但如果我像一样运行相同的命令
SELECT * FROM tableName WHERE MemberID='00000970-b1fd-49ad-89fc-1de066c0076c'
我得到了我想要的输出。。。有人能帮我找出我的问题在哪里吗?conn
这里是一个SqlConnection。谢谢
您声明列为varchar(50)
,但您使用的是DbType.String
;然而,DbType.String
是nvarchar(...)
,即unicode。现在,有时服务器会以"正确的方式"进行转换(这里的"正确"意味着:不会影响性能的转换),但有时它会做出另一种选择(例如,它可能决定不能使用索引并进行表扫描,甚至更糟的是,它可能会决定依次转换每一行进行比较)。因此,最好的做法是首先指定正确的数据类型:使用DbType.AnsiString
。DbType.String
或DbType.AnsiString
都没有"错"——只要它们分别正确地用于表示nvarchar
和varchar
。