一尘不染

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

c#

我在这里阅读了MSDN文档和示例并且知道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

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


阅读 311

收藏
2020-05-19

共1个答案

一尘不染

功能上没有区别。实际上,两者都这样做:

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,它选择枚举重载。

2020-05-19