IF语句中的C#OdbcDataReader.GetBoolean InvalidCastException

IF语句中的C#OdbcDataReader.GetBoolean InvalidCastException,c#,postgresql,odbc,C#,Postgresql,Odbc,请先原谅我的英语不好 好的,antiduh的调试方法帮助我了解代码上发生了什么,感谢所有加入讨论的人 当我使用OdbcDataReader.GetBoolean single时,它是正常的,没有问题,如下所示: OdbcDataReader reader = CMD.ExecuteReader(); reader.Read(); checkBox1.Checked = reader.GetBoolean(0); 不会有问题的 但是 我需要确定该列是否为Null

请先原谅我的英语不好

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


当我使用OdbcDataReader.GetBoolean single时,它是正常的,没有问题,如下所示:

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);
OdbcDataReader reader = CMD.ExecuteReader();
reader.Read();
var foo = reader.GetValue(0);
OdbcDataReader reader = CMD.ExecuteReader();
reader.Read();
if (reader.IsDBNull(0) == false)
{
    var foo = reader.GetValue(0);
}
读卡器上将出现InvalidCastException错误。GetBoolean(0)

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


根据安蒂杜的宝贵评论,, 我发现if reader.GetValue(0)不在if语句中,如下所示:

OdbcDataReader reader = CMD.ExecuteReader();
reader.Read();
if (reader.IsDBNull(0) == false)
    checkBox1.Checked = reader.GetBoolean(0);
OdbcDataReader reader = CMD.ExecuteReader();
reader.Read();
var foo = reader.GetValue(0);
OdbcDataReader reader = CMD.ExecuteReader();
reader.Read();
if (reader.IsDBNull(0) == false)
{
    var foo = reader.GetValue(0);
}
它将返回真或假

但if reader.GetValue(0)位于if语句内部,如下所示:

OdbcDataReader reader = CMD.ExecuteReader();
reader.Read();
if (reader.IsDBNull(0) == false)
    checkBox1.Checked = reader.GetBoolean(0);
OdbcDataReader reader = CMD.ExecuteReader();
reader.Read();
var foo = reader.GetValue(0);
OdbcDataReader reader = CMD.ExecuteReader();
reader.Read();
if (reader.IsDBNull(0) == false)
{
    var foo = reader.GetValue(0);
}
它将返回1或0

因此,如果我使用GetBoolean将1或0转换为bool数据类型,将出现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。

该行和列中的值可能不是bool。添加一些临时调试代码以捕获异常并调用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() );
    }
}

您的命令是否返回超过1行?您确定列中的每个值都可以转换为布尔值吗?该列不是null而是0长度(空)字符串?只有1行,数据库中的列实际上是Bool类型。我发现if语句中没有reader.GetValue(0),它将返回True或False。但若reader.GetValue(0)位于if语句内部,它将返回1或0。所以我想如果语句会改变格式?看看我刚才添加的代码。它将在那里转储实际值的类型,这将告诉您GetBoolean无法强制转换的原因。一个想法是,这可能是Odbc驱动程序和postgres之间的错误。也许可以使用不同的机制来连接你的postgres数据库,比如postgres原生库。首先,对不起,12小时前我的位置几乎是午夜。我尝试您添加的代码,并返回尝试强制转换此类型的代码:System.String。请尝试打印doubleCheck,查看实际值。如果是“1”或“0”,则Odbc驱动程序似乎正在修改数据库服务器和应用程序之间路由中的基础类型。如果不能将其保持为布尔类型,则可能必须手动执行强制转换和解析。是的,它是1或0。再次感谢你。