从C#传递SqlParameter而没有数据类型-性能考虑

use*_*189 5 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
Run Code Online (Sandbox Code Playgroud)

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

提前致谢

mar*_*c_s 5

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

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

SqlParameter p = new SqlParameter("@DatabaseId", Quarter.DataBaseId);
Run Code Online (Sandbox Code Playgroud)

存在一个潜在的大问题,即 ADO.NET 运行时必须猜测您要使用的数据类型。它在大多数情况下都做得很好。但是如果您提供一个值,它应该如何猜测数据类型呢NULL?或者如果您提供 50 - 那是一个吗INTSmallIntTinyIntBigInt

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