从C#传递SqlParameter而不使用数据类型 - 性能考虑因素

时间:2012-03-19 18:36:59

标签: c# ado.net

我尝试了两种不同的方法来实例化我的SqlParameter对象

SQLParameter p = new SqlParameter("@DatabaseId", SqlDbType.VarChar, 5, Quarter.DataBaseId.ToString(); //line 1

SQLParameter p = new SqlParameter("@DatabaseId", Quarter.DataBaseId); // line 2

我想知道在创建参数时不使用数据类型和长度是否有任何性能影响? SQL Server如何在内部处理?最初我假设它会隐式地将参数数据类型转换为与Ex进行比较的表列的数据类型。在sql查询的where子句中。但我不确定。任何帮助将不胜感激。

提前致谢

1 个答案:

答案 0 :(得分:4)

我不认为性能是这里的主要问题 - 尽管使用string(varchar)参数,如果不指定长度,ADO.NET运行时会将参数的最大长度设置为实际长度,这可能是也可能不是一个好主意......

但是:没有使用此语句显式指定数据类型:

SqlParameter p = new SqlParameter("@DatabaseId", Quarter.DataBaseId);

有一个潜在的大问题,即ADO.NET运行时必须猜测您想要使用的数据类型。它做得非常好 - 大多数时候。但是,如果提供NULL值,它应该如何猜测数据类型?或者,如果你提供50 - 是INTSmallIntTinyIntBigInt

未明确指定SqlParameter类型可能会导致不必要的(和不合需要的)转换 - 这可能会降低性能。但更糟糕的是:它可能会导致彻底的错误,因为如果ADO.NET运行时的猜测结束,您最终可能会遇到运行时错误(例如,当它无法正确猜出某些内容是DATETIME时)。