尝试将 SQL int 转换为 C# int? 时出现无效转换异常

3

你好,我目前正在使用以下方法获取SQL Server数据库的列:

public IDataReader myReader()
{
    DbCommand = new SqlCommand("Select * from Mydatabase");
    SqlConnection con = new SqlConnection(connectionstr);
    con.Open();
    DbCommand.Connection = con
    return command.ExecuteReader(CommandBehavior.closeConnection);
}

IDataReader reader = myReader();
while (reader.Read())
{
    int? a = (int?)reader["myIntColumn"];
}

在其他位置(对于其他表),代码工作正常,对于这个表也是如此,直到我处理数据库中的整数字段时。 然后我得到了System.InvalidCastException(在其他表中我没有遇到这个问题)。
我做错了什么吗?还是我需要做些什么才能使它工作? (问题中的int值在数据库中为NULL)
2个回答

5

如果结果为null,则您的代码将无法工作,因为在.NET端,该列的值将为DbNull.Value

尝试这样做:

int? a = reader["myIntColumn"] as int?;

那样运作很有趣。你能告诉我为什么隐式转换会抛出异常,但“as”转换不会吗? - Thomas
1
因为DbNull.Value不是 int? 类型,当你尝试使用as进行强制类型转换时,如果无法转换该值,则它将为null。 - Patrick Hofman
引用:“问题在于三元运算符返回的两个值必须是相同的类型,或者一个可以隐式转换为另一个。在这种情况下,null 不能隐式地转换为 int,反之亦然,因此需要进行显式转换。” - vfioox
是的,我在一些字段上搞错了,我只是不太擅长这个。 - vfioox
有一个问题,如果我在参数列表中使用多个"reader["xyz"] as int?",是否有可能会出现无法正确执行的问题?(当我没有使用单个赋值,而是使用new myobj(reader["my1"] as int?, reader["my2"] as int?,...)时,我再次收到了相同的错误消息。) - Thomas
使用 as 进行转换时,不可能出现此错误消息。还有其他字段吗?另外,请尝试对您的代码进行分解:将所有值初始化到单独的变量中。这将使问题的诊断更加容易。 - Patrick Hofman

1

您需要明确检查 DBNull.Value,如下所示:

while (reader.Read())
{
   var a = reader["myIntColumn"] == DBNull.Value ? null : (int?)reader["myIntColumn"];
}

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