2010-10-26 68 views
2

有沒有什麼聰明的方式來縮短這種淫穢?它的工作原理,但它是不可讀...獲取int?從數據庫使用DbDataReader

int? myVal = r.IsDBNull(r.GetOrdinal("colName")) ? (int?)null : r.GetInt32(r.GetOrdinal("colName")); 

謝謝:)

+3

您可以將該代碼放入DbDataReader的擴展方法中。這樣,它隱藏在一個更好看的'GetNullableInt32()'調用後面的可怕代碼。 – adrianbanks 2010-10-26 08:24:42

+1

@adrianbanks您的評論值得成爲一個答案! – 2010-10-26 08:26:17

+1

@adrianbanks:你應該做出答案,而不是評論... – codekaizen 2010-10-26 08:27:10

回答

6

您可以將該代碼放入DbDataReader的擴展方法中(或者在其實現的IDataReader接口上更好)。這樣一來,可怕的前瞻性代碼被隱藏掉一個更好看GetNullableInt32()調用的背後:

IDataReader reader = ...; 
int? value = reader.GetNullableInt32("colName"); 

正如伊恩指出,這將是更好:

public static class IDataReaderExtensions 
{ 
    public static int? GetNullableInt32(this IDataReader r, string columnName) 
    { 
     int? myVal = r.IsDBNull(r.GetOrdinal(columnName)) 
         ? (int?) null : 
         r.GetInt32(r.GetOrdinal(columnName)); 
     return myVal; 
    } 
} 

可以使用然後調用它調用r.GetOrdinal()只是一次:

public static class IDataReaderExtensions 
{ 
    public static int? GetNullableInt32(this IDataReader r, string columnName) 
    { 
     int ordinal = r.GetOrdinal(columnName); 
     int? myVal = r.IsDBNull(ordinal) 
         ? (int?) null : 
         r.GetInt32(ordinal); 
     return myVal; 
    } 
} 
+0

如果您只調用一次GetOrdinal(columnName),則會更好。 – 2010-10-26 08:32:05

+0

@Ian:我同意(我使用Palantir的原始代碼來演示如何使它成爲擴展方法)。 – adrianbanks 2010-10-26 08:34:12

0

不是真的。我經常把這個代碼放在一個方法中並調用它。這種方法最終可能會出現在一個普通的「幫手」課程中,或者我甚至想到一種擴展方法(儘管我個人不是那些粉絲,因爲他們很難讓其他人發現)。

2

Adrian's answer,你可以做一個通用的擴展方法來滿足所有類型:

int? myVal = r.GetValue<int?>("colName"); 

// ... 

public static class DataReaderExtensions 
{ 
    public static T GetValue<T>(this IDataReader dr, string columnName) 
    { 
     return dr.GetValue<T>(dr.GetOrdinal(columnName)); 
    } 

    public static T GetValue<T>(this IDataReader dr, int columnOrdinal) 
    { 
     // does the column contain null? 
     if (dr.IsDBNull(columnOrdinal)) 
     { 
      // is T either a ref type or a nullable value type? 
      Type t = typeof(T); 
      if (!t.IsValueType || (Nullable.GetUnderlyingType(t) != null)) 
      { 
       // return null 
       return default(T); 
      } 
     } 

     // get the column value, cast it as T and return it 
     // this will throw if the value isn't convertible/unboxable to T 
     return (T)dr.GetValue(columnOrdinal); 
    } 
} 
+0

偉大的建議,謝謝! – Palantir 2010-10-26 11:07:42

相關問題