首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Parameters.Add(string,object)与Parameters.AddWithValue的区别

Parameters.Add(string,object)与Parameters.AddWithValue的区别
EN

Stack Overflow用户
提问于 2012-04-04 03:08:45
回答 5查看 107.9K关注 0票数 51

我阅读了MSDN文档和示例here,我知道Paramters.Add调用的正确语法是:

代码语言:javascript
复制
   command.Parameters.Add("@ID", SqlDbType.Int);
   command.Parameters["@ID"].Value = customerID; 

其中,您必须使用.Value指定参数名称、SqlDbType和值。

现在,Parameters.AddWithValue调用的正确语法是:

代码语言:javascript
复制
   command.Parameters.AddWithValue("@demographics", demoXml);

单行并跳过Type部分。

我的问题是:当我这样做的时候,

代码语言:javascript
复制
   command.Parameters.Add("@demographics", demoXml);
   // .Add method with .AddWithValue syntax

我没有得到任何编译错误,更奇怪的是,当代码执行时,一切似乎都正常工作?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-04-04 03:11:32

在功能方面没有区别。事实上,两者都是这样做的:

代码语言:javascript
复制
return this.Add(new SqlParameter(parameterName, value));

他们弃用旧的参数而支持AddWithValue的原因是为了增加更多的清晰度,以及因为第二个参数是object,这使得一些人不能立即清楚地看到调用了哪个重载的Add,并且它们导致了截然不同的行为。

看一下这个例子:

代码语言:javascript
复制
 SqlCommand command = new SqlCommand();
 command.Parameters.Add("@name", 0);

乍一看,它看起来像是在调用Add(string name, object value)重载,但事实并非如此。它正在调用Add(string name, SqlDbType type)重载!这是因为0可以隐式转换为枚举类型。所以这两行代码:

代码语言:javascript
复制
 command.Parameters.Add("@name", 0);

代码语言:javascript
复制
 command.Parameters.Add("@name", 1);

实际上会导致两个不同的方法被调用。1不能隐式转换为枚举,因此它选择object重载。对于0,它选择枚举重载。

票数 78
EN

Stack Overflow用户

发布于 2012-04-04 03:17:43

不同之处在于使用AddWithValue时的隐式转换。如果您知道正在执行的SQL查询(存储过程)正在接受int、nvarchar等类型的值,那么就没有理由在代码中重新声明它。

对于复杂的类型场景(例如DateTime,float),我可能会使用Add,因为它更显式,但对于更直接的类型场景(Int到Int),我可能会使用AddWithValue。

票数 9
EN

Stack Overflow用户

发布于 2012-04-04 03:16:28

如果不像在command.Parameters.Add("@ID", SqlDbType.Int);中那样显式地提供类型,它将尝试隐式地将输入转换为它所期望的。

这样做的缺点是,隐式转换可能不是最优的转换,并可能导致性能影响。

这里有一个关于这个话题的讨论:http://forums.asp.net/t/1200255.aspx/1

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9999751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档