比较来自世界各地的卖家的域名和 IT 服务价格

差差 Parameters.Add/string, object/ 和 Parameters.AddWithValue

我读了文件 MSDN 和例子
http://msdn.microsoft.com/en-u ... .aspx
, 我知道呼叫的正确语法
Paramters.Add

:


command.Parameters.Add/"@ID", SqlDbType.Int/;
command.Parameters["@ID"].Value = customerID;


您必须指定参数的名称,然后
SqlDbType

AND 意思是
.Value

.

现在是呼叫的正确语法
Parameters.AddWithValue

Takov. :


command.Parameters.AddWithValue/"@demographics", demoXml/;


一行和跳过部分
Type

.

我的问题:当我这样做时,它是如何发生的


command.Parameters.Add/"@demographics", demoXml/;
// .Add method with .AddWithValue syntax


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

詹大官人

赞同来自:

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


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

它选择超载列表。

奔跑吧少年

赞同来自:

使用时的差异位于隐式转换 AddWithValue. 如果您知道可执行请求 SQL /存储过程/ 占用类型的值 int, nvarchar 等等,没有理由在您的代码中重新宣布它。

对于复杂类型方案 /例如, DateTime, float/ 我可能会使用 Add, 因为他更清楚,但是 AddWithValue 对于更多直线类型场景 /Int to Int/.

奔跑吧少年

赞同来自:

没有像这样的类型的明确指示
command.Parameters.Add/"@ID", SqlDbType.Int/;

, 他将试图隐含地将输入转换为它的期望。

这样做的缺点是隐式转换可能不是变换最佳的最佳变换,并且可能导致性能降低。

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

董宝中

赞同来自:

当我们使用时
CommandObj.Parameter.Add//

, 他接受了 2 参数,第一 - 过程参数,以及第二个数据类型,而
.AddWithValue//

接受 2 参数,第一参数过程和第二个数据变量


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


为了
.AddWithValue



CommandObj.Parameter.AddWitheValue/"@ID",textBox1.Text/;


在哪里
ID

- 存储过程的参数,数据类型是相等的
Int

三叔

赞同来自:

功能方面没有区别。

方法
addwithvalue

将一个物体作为一个值。 没有检查类型类型类型。 如果数据类型与表格不匹配,则可能导致错误 SQL. 方法
add

它要求您首先指示数据库类型。 它有助于减少此类错误的数量。


欲获得更多信息,
https://jwcooney.com/2012/09/1 ... alue/

要回复问题请先登录注册