2013-10-22 56 views
2

爲SqlDataReader的鑄造數據我這些(例如,共同的數據類型):傳遞SqlDataReader的作爲參數的函數用於鑄造

string name = reader["name"].ToString(); //for string 


int i = 0; i = int.TryParse(reader["i"].ToString(), out i);  //for int 
int i = reader.GetInt32(reader.GetOrdinal("i"));     //or this again for int 

bool b = reader.GetBoolean(reader.GetOrdinal("b"));    // for boolean 

我想創建與這些函數的類:

public static class gd{ 
    public static bool Bool(SqlDataReader rd, string name) 
    { 
     return rd.GetBoolean(rd.GetOrdinal(name)); 
    } 
    public static int Int(SqlDataReader rd, string name) 
    { 
     int i=0; 
     i = int.TryParse(reader["i"].ToString(), out i); 
     return i; 
    } 
} 

,然後只用:

int i=c.Int(reader,"i"); 
bool b=c.Bool(reader,"b"); 
DateTime dt = c.Date(reader,"dt"); 

我想知道的是它傳遞的DataReader作爲參數是一個好主意?任何人都有更好的理念來鑄造數據讀取器數據?

回答

5

是的,可以將DataReader作爲參數傳遞(與任何其他引用類型一樣)。當你通過閱讀器時,只有對它的引用傳遞給另一個方法。可以使用方法使代碼更具可讀性和可維護性。

您可以編寫擴展方法,以簡化代碼:

public static class Extensions 
{ 
    public static bool GetBoolean(this IDataReader reader, string name) 
    { 
     return reader.GetBoolean(reader.GetOrdinal(name)); 
    } 

    public static int GetInt32(this IDataReader reader, string name) 
    { 
     return reader.GetInt32(reader.GetOrdinal(name)); 
    } 
} 

使用情況將是這樣的:

int i = reader.GetInt32("i"); 
bool b = reader.GetBoolean("b"); 
+0

好吧,我曾想過寫一個擴展方法,但不知道這是一個好主意。非常感謝 –

+0

@AshkanMobayenKhiabani擴展方法是一種簡單的靜態方法。這只是編譯器誰做的魔術和將擴展方法調用轉換爲'Extensions.GetInt32(reader,「i」)' –

+0

你已經使用完全相同的方法名稱sqldatareader已經有了,這不是一個問題嗎? –

1

你的想法似乎罰款(通過參考SqlDataReader的不落後應用程序)如果你想在內部處理異常。你可以使用由SqlDataReader類提供的方法,專爲需要的格式獲取數據:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx

檢查,如果這些方法都sufficent你。如果沒有,你的靜態助手類似乎沒問題,但我建議你避免重複已經在SqlDataReader內部實現的功能,因爲重新發明輪子有什麼意義?

相關問題