2012-02-06 59 views
21

基本上CommandsParameters和参数具有的功能,如AddAddWithValue,等在我见过的所有教程,我通常发现他们正在使用Add代替AddWithValue差异与Parameters.Add和Parameters.AddWithValue

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

VS

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

有什么理由不使用AddWithValue?我宁愿使用它

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

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

+1

看看这个SO问题,这看起来像一样的事情:http://stackoverflow.com/questions/5445663/difference-between-adding-parameters-to-stored-procedure-in-sql-server- 2005 – CCBlackburn 2012-02-06 02:36:16

+1

阅读:http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ – RemarkLima 2015-01-01 15:23:23

回答

24

使用Add()方法,可以通过指定数据的类型和长度来限制用户输入 - 特别是对于varchar列。

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

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

+1

请注意,在.Add让我们来添加一个SqlParameter/OleDbParameter/DbParameter。如果在参数实例中忽略参数名称(通过将其设置为NULL),您将遇到令人讨厌的性能下降:.Net框架将为您创建名称'Parameter1..x'。现在这看起来对于SqlParameter来说很愚蠢,你会想要匹配@variable。但是,使用OleDbParameter ... – 2017-02-02 14:42:02

2

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

8

相信也有一些缺点,使用AddWithValue影响SQL缓存Excection计划请参阅参数长度部分here

+0

考虑到链接文章中的这个可怕的句子: “通过在使用ParameterCollection.AddWithValue时未指定长度,您可以在计划缓存中拥有许多不同的查询,因为您拥有不同的字符串长度。 “ 这里可能是最有价值的回应:) – 2015-03-04 19:46:53

+0

那篇文章挺老的,那还是行为吗? – Maslow 2015-09-17 12:59:04