我阅读了MSDN文档和示例here,我知道Paramters.Add调用的正确语法是:
command.Parameters.Add("@ID", SqlDbType.Int);
command.Parameters["@ID"].Value = customerID; 其中,您必须使用.Value指定参数名称、SqlDbType和值。
现在,Parameters.AddWithValue调用的正确语法是:
command.Parameters.AddWithValue("@demographics", demoXml);单行并跳过Type部分。
我的问题是:当我这样做的时候,
command.Parameters.Add("@demographics", demoXml);
// .Add method with .AddWithValue syntax我没有得到任何编译错误,更奇怪的是,当代码执行时,一切似乎都正常工作?
发布于 2012-04-04 03:11:32
在功能方面没有区别。事实上,两者都是这样做的:
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,它选择枚举重载。
发布于 2012-04-04 03:17:43
不同之处在于使用AddWithValue时的隐式转换。如果您知道正在执行的SQL查询(存储过程)正在接受int、nvarchar等类型的值,那么就没有理由在代码中重新声明它。
对于复杂的类型场景(例如DateTime,float),我可能会使用Add,因为它更显式,但对于更直接的类型场景(Int到Int),我可能会使用AddWithValue。
发布于 2012-04-04 03:16:28
如果不像在command.Parameters.Add("@ID", SqlDbType.Int);中那样显式地提供类型,它将尝试隐式地将输入转换为它所期望的。
这样做的缺点是,隐式转换可能不是最优的转换,并可能导致性能影响。
这里有一个关于这个话题的讨论:http://forums.asp.net/t/1200255.aspx/1
https://stackoverflow.com/questions/9999751
复制相似问题