添加参数的两种情况有啥区别?
Posted
技术标签:
【中文标题】添加参数的两种情况有啥区别?【英文标题】:What's the difference between the two cases of adding parameters?添加参数的两种情况有什么区别? 【发布时间】:2012-08-15 09:30:11 【问题描述】:我想知道两者有什么区别:
DBCmd.Parameters.Add("user_name", IfxType.VarChar);
DBCmd.Parameters["user_name"].Value = p_u;
和
DBCmd.Parameters.Add("user_name", p_u);
这里的最佳做法是什么,哪一种更安全,一种表现优于另一种?
【问题讨论】:
对不起我的错.. 我忽略了它。我将删除链接.. DBCmd.Parameters.Add 有多个重载 DBCmd.Parameters["user_name"].Value = p_u 直接给参数赋值。 【参考方案1】:在显示的示例中,primary 的区别在于它知道要使用的类型是明确的 IfxType.VarChar
- 这 可能 很重要,具体取决于具体情况,以及 IFX 是否将字符串默认为 Char
、VarChar
或 LongVarChar
。老实说,我不知道默认情况下会选择哪些。
显式通常是个好主意,但不需要通过索引器重新获取,因为新参数是从Add
返回的;我可能会建议:
DBCmd.Parameters.Add("user_name", IfxType.VarChar).Value = p_u;
或者也许:
DBCmd.Parameters.Add("user_name", IfxType.VarChar, 20).Value = p_u;
其中20
是参数的大小。
【讨论】:
@just_name “更安全” - 是的,我们是否将“显式”解释为“安全”,这可能不是不合理的; “更高的性能” - 索引器查找是一个非常小的额外(和不必要的)成本,可以通过我上面说明的.Add(...).Value = p_u;
来避免。
是boxing and unboxing
的第二种方式,所以它可能会降低性能?或者如果我不确定datatypes
,我可以使用它吗?
@just_name 这两种方法的装箱/拆箱绝对没有区别;另外,我猜p_u
是string
- 字符串从不装箱(它们是引用类型)。
非常感谢,这意味着我可以互换使用它们而不会出现性能或铸造问题。【参考方案2】:
尽管有 Marc 的回答,但不推荐使用 Parameters.Add
添加值 - 它已替换为 AddWithValue
【讨论】:
严格来说,不完全是。SqlParameterCollection.Add(string,object)
已被弃用 - 但这不是SqlParameterCollection
。实际上,我更像是CreateParameter
的人,因为我主要针对抽象连接/命令接口编写代码,而这些接口没有。此外,即使在 SqlParameterCollection
上,我推荐的 .Add(name, type)
不 也不推荐使用。以上是关于添加参数的两种情况有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章