簡體   English   中英

IF陳述式中的C#OdbcDataReader.GetBoolean InvalidCastException

[英]C# OdbcDataReader.GetBoolean InvalidCastException In IF-Statement

請原諒我的英語不好。

好吧,感謝所有參與討論的人,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);

它將在reader.GetBoolean(0)上發生InvalidCastException錯誤。

我不知道這個問題,有人可以幫我嗎? 拜托〜


根據antiduh的寶貴評論,我發現if reader.GetValue(0)不在if語句中,如下所示:

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

它將返回True或False。

但是,如果reader.GetValue(0)位於if語句的內部,如下所示:

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。

該行和列中的值實際上可能不是布爾值。 添加一些臨時調試代碼以捕獲異常,然后調用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() );
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM