我阅读了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
我没有得到任何编译错误甚至更奇怪,代码执行时一切似乎都能正常工作?
答案 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"
}
}
}
}
}
}
}
}
}
}
}
}
方法要求您首先指定数据库类型。这有助于减少此类错误。