C#OdbcDataReader.GetBoolean InvalidCastException在IF语句中

本文关键字:语句 IF GetBoolean InvalidCastException C#OdbcDataReader | 更新日期: 2023-09-27 18:20:07

请先原谅我英语不好。

好吧,antiduh的调试方法帮助我知道我的代码发生了什么,感谢所有加入讨论的人。


当我使用OdbcDataReader.GetBoolean单个时,它是可以的,没有问题,就像下面一样:

OdbcDataReader reader = CMD.ExecuteReader();
reader.Read();
checkBox1.Checked = reader.GetBoolean(0);                

不会出现任何问题。

但是!!

我需要确定列是否为Null,所以我使用if语句如下:

OdbcDataReader reader = CMD.ExecuteReader();
reader.Read();
if (reader.IsDBNull(0) == false)
    checkBox1.Checked = reader.GetBoolean(0);

它将在读取器上发生InvalidCastException错误。GetBoolean(0)

我不知道这个问题,有人能帮我吗?请~


根据antiduh的宝贵意见,我发现如果读者。GetValue(0)不在if语句中,如下所示:

OdbcDataReader reader = CMD.ExecuteReader();
reader.Read();
var foo = reader.GetValue(0);

它将返回True或False。

但如果读者。GetValue(0)位于if语句内部,如下所示:

OdbcDataReader reader = CMD.ExecuteReader();
reader.Read();
if (reader.IsDBNull(0) == false)
{
    var foo = reader.GetValue(0);
}

它将返回1或0。

因此,如果我使用GetBoolean将1或0转换为布尔数据类型,将发生InvalidCastException。

现在我知道我的代码发生了什么,但仍然不知道两个代码之间的区别。


再次感谢antiduh的宝贵意见,

我尝试下面antiduh提供的代码:

OdbcDataReader reader = CMD.ExecuteReader();
reader.Read();
if (reader.IsDBNull(0) == false)
{
    try
    {
        checkBox1.Checked = reader.GetBoolean(0);
    }
    catch ( InvalidCastException e ) {
        object doubleCheck = reader.GetValue(0);
        Console.WriteLine( "Tried to cast this type: " + doubleCheck.GetType() );
    }
}

它将返回:已尝试强制转换此类型:System.String

并且doubleCheck.ToString()为1或0。

C#OdbcDataReader.GetBoolean InvalidCastException在IF语句中

该行和列中的值实际上可能不是布尔值。添加一些临时调试代码来捕获异常并调用GetValue,然后查看实际得到的结果。

OdbcDataReader reader = CMD.ExecuteReader();
reader.Read();
if (reader.IsDBNull(0) == false)
{
    try {
        checkBox1.Checked = reader.GetBoolean(0);
    }
    catch ( InvalidCastException e ) {
        object doubleCheck = reader.GetValue(0);
        Console.WriteLine( "Tried to cast this type: " + doubleCheck.GetType() );
    }
}