Parameters.Add和Parameters.AddWithValue有什么区别?

36

基本上,CommandsParameters,而这些参数有一些函数,比如 AddAddWithValue 等等。在我看过的所有教程中,我通常发现他们使用的是 Add 而不是 AddWithValue

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

对比

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

使用AddWithValue有什么不适合的理由吗?我更喜欢使用它而不是...

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

因为这样可以节省我的编码时间。所以哪个更好用呢?哪个更安全?这会提高性能吗?


1
看一下这个SO问题,这似乎是同样的事情:https://dev59.com/l1XTa4cB1Zd3GeqP3ZwK - CCBlackburn
1
请阅读:http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ - RemarkLima
4个回答

29
使用 Add() 方法,可以通过指定数据类型和长度来限制用户输入 - 尤其是针对 varchar 列。
.Parameters.Add("@name",SqlDbType.VarChar,30).Value=varName;

使用AddWithValue()(隐式转换值)方法时,它会将nvarchar值发送到数据库。


2
请注意,.Add 有一个重载,可以让您添加 SqlParameter/OleDbParameter/DbParameter。当您在参数实例中省略参数名称(将其设置为 NULL)时,您会遇到严重的性能问题:.Net 框架会为您创建名称“Parameter1..x”。对于 SqlParameter 来说,这似乎很愚蠢,因为您希望匹配 @variable。但是对于 OleDbParameter 来说... - Michel van Engelen

12

我认为使用AddWithValue方法也存在一些缺点,这些缺点会影响SQL缓存执行计划,请参见此处的“参数长度”部分。


1
考虑到链接文章中这个可怕的句子:“当您使用ParameterCollection.AddWithValue时不指定长度,您可以在计划缓存中拥有与不同字符串长度相同数量的不同查询。” 这可能是此处最有价值的回复 :) - Viktor Svub
那篇文章相当古老,这个行为还是一样的吗? - Maslow

3

使用AddWithValue()方法会根据当前值的长度添加参数。如果你的参数值的长度经常变化,这意味着每次都会生成新计划。这会导致查询运行变慢(需要额外的解析和编译时间),也会增加服务器负载。


2

在一般情况下,我会使用AddWithValue。而只有当您的列类型与.NET转换CLR类型不同的时候,才使用Add(name,dbtype ...)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接