2013-02-21 33 views
2

其实我有疑问,所以请清除它。我有两条线做同样的工作,见下面两者参数赋值的区别

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

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

两条线的工作原理是一样的。

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

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

+0

这是分析指出的是你的应用程序性能最重要的行(或者甚至是最高的,比如20%)。如果没有,为什么花时间呢? – 2013-02-21 07:32:56

回答

0

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

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

检查这里:Parameters.AddWithValue vs. Parameters.Add

1

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

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

其次,性能不会在所有如果隐式类型显著的影响是一样的,你要指定明确的一个。你正在做一个数据库查询 - 你真的认为找到一个对象的类型和一个字符串的长度,甚至可以衡量比其余的调用,这几乎肯定涉及网络活动?如果错误地推断出类型为,那么最终可能导致其他地方发生额外的转换,这可以避免。

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