SqlCommand添加参数时不指定类型引发的杯具

之前为了省事,给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);
}

 前几天用户报告有一个查询方法超时,找了N久原因,最后才发现是添加参数时不指定参数类型造成的

一个varchar类型的参数没有指定SqlDbType,程序将没有指定类型的string统一当做nvarchar处理

而该varchar字段正好是建立索引的字段,在查询时数据库引擎会把该varchar字段转换成nvarchar处理

导致索引失效,查询涉及的几张表各有几十万条数据

(详见http://www.cnblogs.com/liunx/archive/2008/04/05/1138615.html)

原本只需要不到10秒钟的查询,由于没有指定 DbType,足足执行了9分钟,不管什么TimeOut限制都已超过了,杯具啊...

俺以后再也不在这个上面偷懒了...

原文地址:https://www.cnblogs.com/zhlei616/p/1641522.html