代码之家  ›  专栏  ›  技术社区  ›  CJM

为什么我必须为SQL查询强制转换返回参数值?

  •  3
  • CJM  · 技术社区  · 14 年前

    我有一个方法,可以添加或更新数据库(SQL Server)中的记录,它将recordid作为(int32)输出参数返回,成功/失败结果作为(int32)返回值。

    考虑到我正在指定这些参数的类型,为什么在返回它们时必须强制转换它们?

    我希望使用以下内容:

    enquiryID = cmd.Parameters["@EnquiryID"].Value;
    

    …但我和上一代不得不跳过几个额外的环:

    enquiryID = Int32.Parse(cmd.Parameters["@EnquiryID"].Value.ToString());
    

    这不是世界末日,但似乎只是一个冗长的解决方案。为什么parameters.value返回sqlparameters.value对象而不是int32?

    更新:

    好吧,我相信-直接铸造FTW: (int)cmd.Parameters["@EnquiryID"].Value

    2 回复  |  直到 14 年前
        1
  •  5
  •   Dan McClain    14 年前

    SQL Server没有指定要返回的数据类型,因此C无法在处理前推断该类型。此外,sqlparamater是通用的,因此它可以在SQL Server之间传递和对象。SQL Server正在其末尾执行强制转换。

    另外,不要使用 Int32.Parse(cmd.Parameters["@EnquiryID"].Value.ToString()) ,如果你知道它总是一个int,你可以做一个直接的演员。 (int)cmd.Parameters["@EnquiryID"].Value . 如果该值可能返回为空值,则可以添加

    object value = cmd.Parameters["@EnquiryID"].Value;
    if(!value.Equals(DBNull.Value)
        enquiryID = (int)value;
    
        2
  •  2
  •   Jamiec    14 年前

    sqlparameter对象的value属性类型为 object ,这意味着它可以返回任何给定的类型。

    返回实际值的方法是错误的,不应转换为字符串来分析Int32。值属性中的内容只是值的装箱版本,因此这应该足够:

    enquiryID = (int)cmd.Parameters["@EnquiryID"].Value;