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

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

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

如:

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

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

实际上非常重要。 使用不同参数长度发出的相同请求最终作为过程高速缓存中的不同查询。 随着时间的推移,这会导致缓存污染过度活跃的编译事件。 这个问题是Linq2SQL和EF提供商如何实现的主要设计缺陷之一,例如。 了解数据访问代码如何影响数据库性能 。 如果未针对相关问题正确指定参数长度,请参阅查询性能和计划缓存问题。

没有性能或执行时间优势 – 如果没有显式传递,则会推断出大小 :

如果未在size参数中显式设置,则从dbType参数的值推断出Size

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

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

也许问题与所有那些Microsoft Buffer Overflows有关?