3

我有一个参数添加功能,如下所示:

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。谢谢。

4

1 回答 1

1

您声明该列是varchar(50),但您正在使用DbType.String; 然而,DbType.Stringnvarchar(...)- 即unicode。现在,有时服务器会以“正确的方式”进行转换(这里“正确”的意思是:不影响性能的那个),但有时它会做出另一种选择(例如,它可能会决定它不能使用索引并进行表扫描,甚至更糟 - 它可能决定依次转换每一行以进行比较)。因此,最好的办法是首先指定正确的数据类型:使用DbType.AnsiString. DbType.String任何一个或都没有“错误” DbType.AnsiString——只要它们被正确地分别用来表示nvarcharvarchar

于 2013-07-29T12:12:12.303 回答