两种添加参数的情况有什么区别?(涉及IT技术)

3

我想知道以下两者之间的区别:

 DBCmd.Parameters.Add("user_name", IfxType.VarChar);
 DBCmd.Parameters["user_name"].Value = p_u; 

并且。
DBCmd.Parameters.Add("user_name", p_u);

这里有什么最佳实践,哪个更安全,它们之间是否有性能差异?

抱歉,我的错。我忽略了它。我将删除这个链接。 - John Woo
DBCmd.Parameters.Add有多个重载。 DBCmd.Parameters["user_name"].Value = p_u直接将值分配给参数。 - Waqar Janjua
2个回答

5
在所示的示例中,主要区别在于它明确知道要使用的类型是 IfxType.VarChar - 这可能很重要,具体取决于情况和IFX默认字符串作为 CharVarCharLongVarChar。老实说,我不知道它会默认选择哪个。

明确表达通常是一个好主意,但没有必要通过索引器重新获取,因为新参数从 Add 返回;我可能会建议:

DBCmd.Parameters.Add("user_name", IfxType.VarChar).Value = p_u;

或许是:

DBCmd.Parameters.Add("user_name", IfxType.VarChar, 20).Value = p_u;

其中20是参数的大小


1
@just_name "更安全" - 是的,如果我们将"explicit"解释为"safe",这可能是不过分的;"更高性能" - 索引器查找是非常小的额外(且不必要的)开销,可以通过我上面所示的.Add(...).Value = p_u;来避免。 - Marc Gravell
第二种方法是使用“装箱和拆箱”,这样可能会降低性能吗?或者如果我不确定数据类型,我可以使用它吗? - Anyname Donotcare
1
@just_name 在这两种方法之间进行装箱/拆箱没有任何区别;另外,我猜测 p_u 是一个 string 类型 - 字符串永远不会装箱(它们是引用类型)。 - Marc Gravell
非常感谢,这意味着我可以在使用它们时互换而不用担心性能或转换问题。 - Anyname Donotcare

1
尽管Marc的回答是正确的,但使用Parameters.Add添加值已经被弃用了 - 它已被AddWithValue替代。

1
严格来说,不完全是这样。SqlParameterCollection.Add(string,object)已被弃用 - 但这并不是指的SqlParameterCollection。实际上,我更喜欢使用CreateParameter,因为我主要针对抽象连接/命令接口编码,它们都没有这两个方法。此外,我推荐的重载.Add(name, type)即使在SqlParameterCollection上也没有被弃用。 - Marc Gravell

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