之前为了省事,给SQL语句添加参数时从来不指定类型,代码如下:
代码
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = str;
cmd.CommandTimeout = Timeout;
SqlParameter param = new SqlParameter("@name",value);
cmd.Parameters.Add(param);
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
}
{
cmd.CommandText = str;
cmd.CommandTimeout = Timeout;
SqlParameter param = new SqlParameter("@name",value);
cmd.Parameters.Add(param);
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
}
前几天用户报告有一个查询方法超时,找了N久原因,最后才发现是添加参数时不指定参数类型造成的
一个varchar类型的参数没有指定SqlDbType,程序将没有指定类型的string统一当做nvarchar处理
而该varchar字段正好是建立索引的字段,在查询时数据库引擎会把该varchar字段转换成nvarchar处理
导致索引失效,查询涉及的几张表各有几十万条数据
(详见http://www.cnblogs.com/liunx/archive/2008/04/05/1138615.html)
原本只需要不到10秒钟的查询,由于没有指定 DbType,足足执行了9分钟,不管什么TimeOut限制都已超过了,杯具啊...
俺以后再也不在这个上面偷懒了...