【问题标题】:Difference with Parameters.Add and Parameters.AddWithValue与Parameters.Add和Parameters.AddWithValue的区别
【发布时间】:2012-02-27 15:02:08
【问题描述】:

基本上CommandsParameters,参数有AddAddWithValue 等函数。在我看过的所有教程中,我通常注意到他们使用Add 而不是AddWithValue .

.Parameters.Add("@ID", SqlDbType.Int)

.Parameters.AddWithValue("@ID", 1)

是否有理由不使用AddWithValue?我更喜欢使用它而不是

Parameters.Add("@ID", SqlDbType.Int, 4).Value = 1

因为它节省了我的编码时间。那么哪个更好用呢?哪个可以安全使用?它会提高性能吗?

【问题讨论】:

标签: c# .net vb.net ado.net


【解决方案1】:

使用Add() 方法,您可以通过指定数据的类型和长度来限制用户输入——尤其是varchar 列。

.Parameters.Add("@name",SqlDbType.VarChar,30).Value=varName;

AddWithValue()(值的隐式转换)方法的情况下,它将nvarchar值发送到数据库。

【讨论】:

  • 请注意,.Add 上有一个重载,让我们添加一个 SqlParameter/OleDbParameter/DbParameter。当您在参数实例中省略 参数名称(通过将其设置为 NULL)时,您将受到严重的性能影响:.Net 框架将为您创建名称“Parameter1..x”。现在这对于 SqlParameter 来说似乎很愚蠢,您可能想要匹配 @variable。但是使用 OleDbParameter...
【解决方案2】:

我相信使用 AddWithValue 也有一些影响 SQL Cache Excection Plan 的缺点,请参阅参数长度部分here

【讨论】:

  • 考虑到链接文章中的这个可怕的句子:“通过在使用 ParameterCollection.AddWithValue 时不指定长度,您可以在计划缓存中拥有与不同字符串长度一样多的不同查询。 "这可能是这里最有价值的回应:)
  • 那篇文章很老了,还是那个行为吗?
【解决方案3】:

我会在正常情况下使用 AddWithValue。并且仅当您的列类型与 .net 转换 CLR 类型的方式不同时才使用 Add(name, dbtype...。

【讨论】:

    【解决方案4】:

    使用 AddWithValue() 添加具有当前值长度的参数。如果您的参数值的长度经常变化,这意味着每次都会生成新的计划。这会使您的查询运行速度变慢(解析、编译的额外时间)并且还会导致更高的服务器负载。

    【讨论】:

      猜你喜欢
      • 2016-07-05
      • 2012-04-17
      • 2013-04-11
      • 2011-02-01
      • 2013-10-29
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多