SqlCommand的Parameters.Add和AddWithValue有什么区别?

35

应该在何时使用Parameters.Add/AddWithValue? 在以下MSDN示例中,他们使用Parameters.Add添加int,使用Parameters.AddWithValue添加string

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

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

什么是在 datetime 中最好使用的内容?


4
cmd.Parameters.Add现在已经被弃用。请改用cmd.Parameters.AddWithValue - Rahul Nikate
3
正如Bacon Bits所述,“cmd.Parameters.Add(String, SqlDbType)”并未被弃用。只有“cmd.Parameters.Add(String, Object)”被弃用(现已过时)。 - MarredCheese
1
事实上,SQL专家们(搜索相关关键词以获取文章)最近的趋势似乎更倾向于使用Add(String, SqlDBType)并放弃AddWithValue,因为数据类型不确定性导致的低效率问题。(是的,这个问题很古老...但我现在在这里!) - izzy
1个回答

49
如果您想要更明确地进行一些操作,可以使用 Add 。 如果您懒得麻烦,请使用 AddWithValue AddWithValue 将推导出其值的参数类型,因此请确保它是正确的类型。 例如,如果 int 是正确的类型,则应将 string 解析为 int
避免使用 Add 的一个原因是,如果您的参数类型为 int ,则必须小心处理带有参数名称和对象的重载函数,因为此时会选择另一个带有 SqlDbType 枚举的函数重载
来自备注(方法重载甚至现在已经是已过时):
使用这个重载的 SqlParameterCollection.Add 方法来指定整数参数值时,需要小心。由于这个重载方法接受一个 Object 类型的值,当这个值为零时,你必须将整数值转换为 Object 类型。如果你不执行此转换,编译器会认为你试图调用 SqlParameterCollection.Add(string, SqlDbType) 重载方法。请注意,保留 html 标签。

cmd.Parameters.AddзЋ°ењЁе·Із»Џиў«ејѓз”Ёдє†гЂ‚иЇ·дЅїз”Ёcmd.Parameters.AddWithValueд»Јж›їгЂ‚ - Rahul Nikate
7
AddWithValue也不是最好的方法,因为它从参数值推断参数类型。这经常导致错误的执行计划或不正确的转换。它也没有首先验证参数(例如:如果参数类型为Datetime但您传递了String)。只有Add(String parameterName, Object value)已被弃用,所有其他Add重载都没有被弃用。我更喜欢带有参数名称和SqlDbType的那个(如果是字符串类型,请考虑指定大小)。 - Tim Schmelter
2
AddWithValue只是避免了我在答案中提到的问题,并且具有与Add(string, object)相同的功能。 - Tim Schmelter
3
我不同意 Add 比 AddWithValue 更好的说法,它们都可能会出错,因此使用任何一个更简单的。使用 Add 可以提前设置参数,这样你只需要指定对象即可。而且,可以这样使用 Parameters.Add("@BEGDATE", SqlDbType.DateTime).Value = myDate,几乎和 AddWithValue 一样简短。 - Gerard ONeill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接