SqlCommand 参数 Add 与 AddWithValue [duplicate]

SqlCommand Parameters Add vs. AddWithValue [duplicate]

提问人:YAKOVM 提问时间:1/14/2014 更新时间:6/19/2020 访问量:115209

问:

我应该什么时候使用? 在以下 MSDN 示例中,他们使用 for 和 forParameters. Add/AddWithValueParameters.AddintParameters.AddWithValuestring

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

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

什么用途最好datetime

C# 参数 SQL命令

评论

4赞 Rahul Nikate 5/21/2015
cmd.Parameters.Add 现已弃用。请改用 cmd.Parameters.AddWithValue
3赞 MarredCheese 6/6/2018
@RahulNikate 如下面的 Bacon Bits 所述,“cmd.Parameters.Add(String, SqlDbType) 未弃用。只有 cmd.Parameters.Add(String, Object) 已弃用(现已过时)。
1赞 izzy 2/20/2021
事实上,SQL 专家最近的趋势(搜索文章的相关关键字)似乎倾向于使用 Add(String, SqlDBType) 并放弃 AddWithValue,因为数据类型模糊导致效率低下。(是的,这个问题很古老......但我现在在这里!

答:

49赞 Tim Schmelter 1/14/2014 #1

如果您想通过更多的工作使所有内容变得明确,请使用。如果你懒惰,请使用。 将派生其值的参数类型,因此请确保其类型正确。例如,如果 to 是正确的类型,则应将其解析为。AddAddWithValueAddWithValuestringint

有一个原因需要避免:如果你的参数类型是,你必须小心采用参数名称和对象的重载,因为这样就会使用 SqlDbType-enum 选择另一个重载Addint

备注(方法重载甚至现在):obsolete

使用该方法的此重载来指定整数参数值时要小心。 由于此重载采用 Object 类型的值,因此必须将 当值为零时,对象类型的整数值 ...如果不执行此转换, 编译器假定您正在尝试调用重载。SqlParameterCollection.AddSqlParameterCollection.Add(string, SqlDbType)

评论

7赞 Tim Schmelter 5/21/2015
@RahulNikate: 也不是最好的方法,因为它从参数值推断参数的类型。这通常会导致糟糕的执行计划或不正确的转换。它也不会首先验证参数(例如,键入 if 但传递 a )。Only 已弃用所有其他 not 的重载。我更喜欢采用参数名称和 (考虑指定字符串类型的大小)的那个。AddWithValueDatetimeStringAdd(String parameterName, Object value)AddSqlDbType
2赞 Tim Schmelter 5/21/2015
AddWithValue只是避免了我的回答中提到的问题,并具有与 .Add(string, object)
3赞 Gerard ONeill 10/7/2015
我不同意 Add 比 AddWithValue 更好——它们都可能犯错误——所以使用哪个更简单。Add 可用于提前设置参数,以便您只需指定对象。另外,这个.几乎和 AddWithValue 一样短。Parameters.Add("@BEGDATE", SqlDbType.DateTime).Value = myDate