C# SqlCommand参数Add与AddWithValue

C# SqlCommand参数Add与AddWithValue,c#,parameters,sqlcommand,C#,Parameters,Sqlcommand,我应该何时使用参数。添加/AddWithValue? 在下面的MSDN示例中,它们使用参数。对于int使用Add和参数。对于字符串使用AddWithValue command.Parameters.Add("@ID", SqlDbType.Int); command.Parameters["@ID"].Value = customerID; command.Parameters.AddWithValue("@demographics", demoXml); 如果您想通过稍微多做一点工作使所有

我应该何时使用
参数。添加/AddWithValue
? 在下面的MSDN示例中,它们使用
参数。对于
int
使用Add
参数。对于
字符串使用AddWithValue

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

command.Parameters.AddWithValue("@demographics", demoXml);

如果您想通过稍微多做一点工作使所有内容显式化,那么最好使用
datetime

使用
Add
。如果您懒惰,请使用
AddWithValue
AddWithValue
将派生其值的参数类型,因此请确保其类型正确。例如,如果类型正确,则应该将
字符串
解析为
int

有一个避免添加的原因:若参数类型为int,则必须小心使用

From(方法重载现在甚至已过时):

当您使用此超负荷的
SqlParameterCollection。添加
方法以指定整数参数值。 由于此重载采用Object类型的值,因此必须转换 当值为零时,对象类型的整数值 ... 如果不执行此转换,则 编译器假定您正在尝试调用
SqlParameterCollection.Add(string,SqlDbType)
重载


@RahulNikate如下面Bacon Bits所述,“cmd.Parameters.Add(String,SqlDbType)没有被弃用。只有cmd.Parameters.Add(String,Object)被弃用(现在已经过时)。”事实上,SQL专家们最近的趋势(搜索相关关键字以查找文章)似乎倾向于使用Add(String,SqlDbType)由于数据类型不明确导致效率低下,放弃AddWithValue。(是的,这个问题很古老……但我现在在这里!)@RahulNikate:
AddWithValue
也不是最好的方法,因为它从paramater值推断参数的类型。这通常会导致错误的执行计划或不正确的转换。它也不会首先验证参数(例如,键入if
Datetime
,但传递一个
字符串
)。只有
Add(字符串参数名称,对象值)
不推荐使用
Add的所有其他重载。我更喜欢使用参数名和
SqlDbType
(如果是字符串类型,请考虑指定大小)。
AddWithValue
只是避免了我回答中提到的问题,并且具有与
Add(字符串,对象)相同的功能
。我不同意Add比AddWithValue更好——它们都可能出错——所以使用哪一个更简单。“添加”可用于提前设置参数,以便只需指定对象。另外,这个
参数.Add(“@BEGDATE”,SqlDbType.DateTime).Value=myDate
。几乎和AddWithValue一样短。请注意。只有