2010-11-10 38 views
0

我想要使用SqlDataReader(我很瞭解Linq等的美,但我正在構建的應用程序部分是一個SQL生成器,所以Linq不適合我的需要)。不幸的是,我不確定使用SqlDataReader時的最佳實踐。我在我的代碼中的幾個地方使用如下代碼:SqlDataReader是否具有與字符串鍵相同的Get *(int index)?

using (SqlDataReader reader = ...) 
{ 
    int ID = reader.GetInt32(0); 
    int tableID = reader.GetInt32(1); 
    string fieldName = reader[2] as string; 
    ...//More, similar code 
} 

但是感覺非常不穩定。如果數據庫發生變化(在這種情況下實際上不太可能),代碼就會中斷。是否有一個等同於SqlDataReader的GetInt32,GetString,GetDecimal,需要一個列名而不是索引?在這種情況下什麼被認爲是最佳實踐?什麼是最快的?我的代碼的這些部分是我的代碼中最耗時的部分(我對它進行了幾次簡介),所以速度非常重要。

[編輯]

我知道使用索引用字符串的,我misworded以上。我正在運行緩慢的運行時間。我的代碼工作正常,但我正在尋找任何可以在這些循環中偷回幾秒鐘的方法。通過字符串訪問會減慢我的速度嗎?我知道db訪問是主要的時間密集型操作,對此我無能爲力,所以我想減少訪問每個元素的處理時間。

[編輯]

我決定只用GetOrdinal運行,除非某人有更具體的例子。我稍後會運行效率測試。我會盡量記住在我實際運行測試時發佈它們。

回答

4

索引器屬性需要一個字符串鍵,因此您可以執行以下操作。

reader["text_column"] as string; 
Convert.ToInt32(reader["numeric_column"]); 

其他建議

如果你關心的字符串查找是緩慢的,並假定數字查找更快,你可以通過一個大循環的結果之前嘗試使用GetOrdinal找到列索引組。

int textColumnIndex = reader.GetOrdinal("text_column"); 
int numericColumnIndex = reader.GetOrdinal("numeric_column"); 
while (reader.Read()) 
{ 
    string text = reader[textColumnIndex] as string; 
    int number = Convert.ToInt32(reader[numericColumnIndex]); 
} 
+1

改爲使用int.Parse/TryParse。 – Femaref 2010-11-10 14:55:56

+0

是的,我知道。我主要對速度感到好奇,如果這會讓我的代碼中最耗時的部分變得更慢。 – Crisfole 2010-11-10 15:01:01

+0

@Femaref:爲什麼?我沒有意識到Convert.ToInt32和int.Parse之間有明顯的區別嗎? – batwad 2010-11-10 16:37:11

相關問題