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

时间:2012-04-03 19:08:45

标签: 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

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

5 个答案:

答案 0 :(得分:75)

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

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:3)

如果没有明确地提供command.Parameters.Add("@ID", SqlDbType.Int);中的类型,它将尝试隐式地将输入转换为它所期望的内容。

这样做的缺点是,隐式转换可能不是转换中最优化的转换,并且可能会导致性能下降。

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

答案 3 :(得分:1)

当我们使用CommandObj.Parameter.Add()时,它首先取2参数是过程参数,第二个是它的数据类型,但.AddWithValue()先取2参数是过程参数,第二是数据变量

CommandObj.Parameter.Add("@ID",SqlDbType.Int).Value=textBox1.Text;

// for .AddWithValue

CommandObj.Parameter.AddWitheValue("@ID",textBox1.Text);

其中ID是存储过程的参数,数据类型为Int

答案 4 :(得分:0)

功能方面没有区别


{ "dell": { "memory": { "RAM": { "RamType": "DDR", "Size": 16 }, "Graphic": { "RamType": "GDDR", "Size": 4, "dummy": "dummy" } }, "dummy": "dummy" } } 方法将对象作为值。没有类型数据类型检查。如果数据类型与SQL表不匹配,可能会导致错误。 { "$schema": "http://json-schema.org/draft-06/schema#", "properties": { "computers": { "patternProperties": { "additionalProperties": false, "^[a-z0-9-_]+$": { "properties": { "memory": { "patternProperties": { "^[a-z0-9-_]+$": { "additionalProperties": false, "properties": { "RamType": { "type": "string", "RamSize": { "type": "number" } } } } } } } } } } } } 方法要求您首先指定数据库类型。这有助于减少此类错误。

详细信息Please click here