我試圖使用此方法的數據庫蒙上了空布爾:如何從C#中的數據讀取器投射null布爾值?
bool? primaryFlag = reader["primaryflag"] is DBNull ? null: (bool?)reader["primaryflag"];
我不斷收到一個指定的強制轉換無效異常。我正在使用的方法有什麼問題?
我試圖使用此方法的數據庫蒙上了空布爾:如何從C#中的數據讀取器投射null布爾值?
bool? primaryFlag = reader["primaryflag"] is DBNull ? null: (bool?)reader["primaryflag"];
我不斷收到一個指定的強制轉換無效異常。我正在使用的方法有什麼問題?
您不能直接將它投射到Nullable<bool>
。但是你可以使用as
操作:
bool? primaryFlag = reader["primaryflag"] as bool?;
這工作,因爲如果該值DBNull.Value
轉換失敗,所以它會正確地分配bool?
是null
。
或小於這個優雅版:
bool? primaryFlag = null;
int colOrdinal = reader.GetOrdinal("primaryflag");
if(!reader.IsDBNull(colOrdinal))
primaryFlag = reader.GetBoolean(colOrdinal);
,你必須也(bool?) null
投下的null
值。
問題是,在讀者的價值是從來沒有 a bool?
。
當然,如果轉換爲bool
,那麼在三元組中將會出現錯誤,因爲編譯器沒有可以推斷出的常見類型。我用一個簡單的技巧,而不是:
reader["primaryFlag"] is DBNull ? default(bool?) : (bool)reader["primaryFlag"];
default(bool?)
意味着完全一樣的東西在運行時null
,但它使空「類型化」,至於編譯器而言。
這也是非常方便有此作爲一個擴展的方法,所以你可以做這樣的事情
reader.GetNullable<bool>("primaryFlag")
有一個2級邏輯的解決方案: 1鑄造DB值所需的任務:
bool? primaryFlag = (bool?)reader["primaryflag"]
2更simular到你的做法:
bool? primaryFlag = reader["primaryflag"] is DBNull ? (bool?) null: (bool)reader["primaryflag"];
的 '爲' 經營者的工作編輯。謝謝! =) –