从int转换为long throws异常

Iva*_*ono 1 c# sql-server-2012

我有一个包含2列的表(string&int).int列的当前值是-1.

使用SQLDataReader我正在读取此表中的行:

public class MyObject
{
    public string Name;
    public long Number;
}

using (SqlDataReader dataReader = command.ExecuteReader())
{
    MyObject o = new MyObject()
    while (dataReader.Read())
    {
        o.Name= dataReader.GetString(0);
        o.Number = dataReader.GetInt64(1);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我正在InvalidCastException阅读Number专栏文章.我在这里错过了什么?

Har*_*lse 5

SqlDataReader.GetInt64的备注部分指出:

没有进行转换; 因此,检索的数据必须已经是64位有符号整数.

顺便说一句:如果您的值可以为空,请不要忘记调用IsDBNUll

您确定检索到的数据是数据库中的bigint吗?如果是int或nchar/nvarchar,则应使用相应的函数并将其转换或解析为System.Int64

有人建议提高代码的健壮性

  • 使用SqlDataReader [columnName]而不是GetInt64.这将为您提供原始类型的对象,该对象最有可能转换为您的long.
  • 使用列名而不是列号可以提高代码的稳定性.如果在查询中重新排序列,或者在查询中添加或删除了不同的列,它仍然有效
  • 如果您真的想要坚持使用GetInt ...函数,请使用SqlDataReader.GetOrdinal(列名称)来获取列号.
  • 在分配之前使用SqlDataReader.GetFieldType来检查列的类型并使用相应的GetInt ..函数