c# - Parameters.Add(string, object) 和 Parameters.AddWithValue 之间的区别

标签 c# sql stored-procedures parameters

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

   command.Parameters.Add("@ID", SqlDbType.Int);
   command.Parameters["@ID"].Value = customerID; 

您必须在其中指定参数名称、SqlDbType 以及带有 .Value 的值。

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

   command.Parameters.AddWithValue("@demographics", demoXml);

单行并跳过 Type 部分。

我的问题是:当我这样做时,这是怎么回事,

   command.Parameters.Add("@demographics", demoXml);
   // .Add method with .AddWithValue syntax

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

最佳答案

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

return this.Add(new SqlParameter(parameterName, value));

他们弃用旧参数而支持 AddWithValue 的原因是为了增加清晰度,以及因为第二个参数是 object,这使得它不是很明显对一些人来说,调用了 Add 的重载,他们导致了截然不同的行为。

看看这个例子:

 SqlCommand command = new SqlCommand();
 command.Parameters.Add("@name", 0);

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

 command.Parameters.Add("@name", 0);

 command.Parameters.Add("@name", 1);

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

关于c# - Parameters.Add(string, object) 和 Parameters.AddWithValue 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9999751/

相关文章:

sql - GCP Node js API 中的事务提交返回 {"code":10 ,"rowCounts":[]} with spanner

mysql - 对这个简单的 INNER JOIN 查询有疑问吗?

mysql - 多级Combox-MySQL查询

c# - 如何在脚本组件中访问 ssis 包变量

c# - SignalR - 仅适用于本地主机

c# - 如何在方法中使用多个返回语句在 PostSharp 中应用异常方面?

c# - 当按我搜索的字段排序时,我可以更快地搜索排序的 List<T> 吗?

oracle - PL/SQL : Procedures Successful with compilation error

java - 如何使用 MyBatis 从 SQL 调用存储过程

php - SELECT INTO 还是存储过程?