为什么要设置命令对象参数的size参数呢?

时间:2010-10-27 21:49:04

标签: c# sql-server ado.net

我们的数据访问层使用命令对象与sql server进行通信。

在大多数情况下,我已将字段大小(与sql server中的列大小相匹配)硬编码到命令参数构建器中。

如:

SqlParameter param = new SqlParameter("@name", NVarChar, 4000);

在这里指定一个值(本例中为4000)而不是将其保留为0有什么好处?当列大小发生变化时,必须重新编译时会很痛苦。

3 个答案:

答案 0 :(得分:5)

实际上非常重要。使用不同参数长度发出的相同请求最终作为过程高速缓存中的不同查询。随着时间的推移,这会导致缓存污染过度活跃的编译事件。这个问题是Linq2SQL和EF提供商如何实现的主要设计缺陷之一,例如。见How Data Access Code Affects Database Performance。另请参阅Query performance and plan cache issues when parameter length not specified correctly了解相关问题。

答案 1 :(得分:2)

没有性能或执行时间优势 - size is inferred if it is not explicitly passed

  

如果未在size参数中明确设置,则从dbType参数的值推断出大小

我想您可以说,通过明确声明参数的大小以匹配SQL Server中字段的大小,您可以更好地告知读者您的代码关于数据模型的限制。在旁观者眼中可能有多大用处。

答案 2 :(得分:0)

如果指定的大小与SQL列的宽度相匹配,那么可能是您有另一个层来检测和/或防止数据丢失。 (当用户输入或应用程序生成的字符多于可以存储在数据库中的字符时会发生什么?)

问题可能与所有那些Microsoft Buffer Overflows有关?