Parameters.Add和Parameters.AddWithValue之间的区别

pha*_*unk 49 c# sql parameters stored-procedures

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

   command.Parameters.Add("@ID", SqlDbType.Int);
   command.Parameters["@ID"].Value = customerID; 
Run Code Online (Sandbox Code Playgroud)

您必须在其中指定参数名称,SqlDbTypeAND与值.Value.

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

   command.Parameters.AddWithValue("@demographics", demoXml);
Run Code Online (Sandbox Code Playgroud)

单行并跳过该Type部分.

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

   command.Parameters.Add("@demographics", demoXml);
   // .Add method with .AddWithValue syntax
Run Code Online (Sandbox Code Playgroud)

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

vcs*_*nes 76

功能方面没有区别.事实上,两者都这样做:

return this.Add(new SqlParameter(parameterName, value));
Run Code Online (Sandbox Code Playgroud)

他们弃用旧版本的原因AddWithValue是为了增加额外的清晰度,以及因为第二个参数是object,这使得一些人不会立即明白Add被调用的重载,并且它们导致了截然不同的行为.

看看这个例子:

 SqlCommand command = new SqlCommand();
 command.Parameters.Add("@name", 0);
Run Code Online (Sandbox Code Playgroud)

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

 command.Parameters.Add("@name", 0);
Run Code Online (Sandbox Code Playgroud)

 command.Parameters.Add("@name", 1);
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,警告是因为**此过载已过时**如文档中所标记的那样.同样来自文档,"当您使用SqlParameterCollection.Add方法的这个重载来指定整数参数值时要小心." (4认同)

Den*_*ngo 9

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

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