我阅读了 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/