2010-07-28 50 views
1

我想初始化一個類,數據來自MySql數據庫。某些字段可以爲空:VB.NET 2010和MySql - 爲懶惰的人處理數據庫空缺

Dim dr As MySqlDataReader = ... 
Dim item As New Item(dr.GetInt16(0), dr.GetString(1), dr.GetString(2)) 

假設最後兩個字段可能爲NULL在數據庫中,以便調用GetString的在那場導致異常。

我當然可以編寫代碼來測試空值之前,我每場:

dim field1 as String 
if (dr.IsDbNull(1)) 
    field1 = Nothing     ' or even "" 
else 
    field1 = dr.GetString(1) 

但如果你有很多的領域,這是一個「如果」的噩夢。

爲了這個目的,我改寫了國際金融研究所VB的功能,使其更加類型化,從而避免強制轉換:

Namespace Util 

Public Shared Function IIf(Of T)(ByVal condition As Boolean, ByVal iftrue As T, ByVal iffalse As T) As T 
     If condition Then Return iftrue Else Return iffalse 
End Function 

,這樣我可以寫的東西,如:

Dim item As New Item(
    dr.GetInt16(0), 
    Util.IIf(dr.IsDbNull(1), "", dr.GetString(1), 
    Util.IIf(dr.IsDbNull(2), "", dr.GetString(2)) 

的類型I如果在其他情況下可以很好地工作,但不幸的是,在這種情況下它不會工作,因爲是正常功能,而不是語言關鍵字,每個輸入參數在ca如果該字段爲NULL,則引發異常。

你能想到一個優雅的無解決方案嗎?

回答

0

首先,我建議你使用一個ORM映射器 - 現在當你不得不手動「映射」的時候,很少有例子。

如果這是這些情況之一,我建議您在訪問數據讀取器時使用字段名稱而不是索引。

並回答您的原始問題:嘗試擴展方法。對不起,C#,但VB.NET的語法驅使我堅果:

public static class DbDataReaderExtensions 
{ 
    public static T GetField<T>(this DbDataReader dbDataReader, string fieldName, 
     T defaultValue) 
    { 
     if(dbDataReader.IsDBNull(fieldName)) 
      return defaultValue; 
     return (T)dbDataReader[fieldName]; 
    } 
} 
+0

類型轉換就好了:當你調用像GetString這樣的強類型函數時,在內部添加'DbDataReader'實現。 – 2010-07-28 09:10:16

0

謝謝。

我看了很多ORM,我不喜歡他們出於某種原因,所以我決定調用純存儲過程來獲取數據。你能建議一些強大而簡單的東西嗎?

即使使用字段名稱,即使速度稍慢,也是比較安全的。

我剛來與方法相同的結論,但我還是不喜歡的就是類型轉換:

Public Shared Function IfNull(Of T)(ByVal dr As MySqlDataReader, ByVal index As Integer, ByVal _default As T) As T 
     If dr.IsDBNull(index) Then 
      Return _default 
     Else 
      Return CType(dr.GetValue(index), T) 
     End If 

End Function 

我希望做一些更優雅,以獲得「真正的」來自閱讀器的數據類型。