两个参数赋值之间的差异

时间:2013-02-21 07:25:51

标签: c# sqlparameters sql-parametrized-query

实际上我有疑问,所以请清除它。我有2行做同样的工作,见下文

1. cmd.Parameters.AddWithValue("@UserName",objBELUserDetails.UserName);

2. cmd.Parameters.Add("@UserName",SqlDbType.Nvarchar,50).
                                      Value=objBELUserDetails.UserName;

这两行都是一样的。

如果您没有提供大小,那么大小默认为作为参数值的字符串的长度,如果省略该类型,则它会查看参数值的类型并使用一个大的case语句,用于将对象的类型映射到相关的Sql类型。如果您自己提供类型,那么显然有助于您的代码的性能,以便它不必解决它。

所以,你不认为第二行代码会花费比第一行更多的时间并影响代码的性能,因为第一行具有特定的类型和大小,因此编译器不需要时间找出参数的类型和大小。不是吗?

2 个答案:

答案 0 :(得分:1)

  

所以你不认为第二行代码会花费比第一行更多的时间并影响代码的性能,因为第一行具有特定的类型和大小,因此编译器不需要时间来查找参数的类型和大小。不是吗?

首先,我认为你的“第一”和“第二”在这里错了。它是第二个版本,具有特定的类型和大小。

其次,性能不会对所有产生重大影响,如果隐式类型与您明确指定的类型相同。您正在进行数据库查询 - 您是否真的认为找到对象的类型和字符串的长度与其他调用相比甚至可以测量,这几乎肯定涉及网络活动?如果错误推断出类型,您最终可能会在其他位置引起额外的转换,这是可以避免的。

指定参数的类型和大小有一个更重要的原因:它使参数的信息显式化,然后任何人都可以检查它是否与数据库期望的匹配。字符串可以转换为多种类型 - 并且与数字同上。通过明确说明类型,您可以消除任何歧义。

答案 1 :(得分:0)

command.Parameters.Add如果没有明确提供类型,它会尝试隐式地将输入转换为期望的类型。

这种隐式转换可能不是转化的最佳选择,因此可能会导致性能下降。

点击此处:Parameters.AddWithValue vs. Parameters.Add