2013-09-27 51 views
10

你好我有這個代碼從SQL DB讀取數據。使用SqlDataReader.IsDBNull時使用列名稱

我不知道該如何編輯它才能使用原始列名稱而不是列索引。

string query = "SELECT * FROM zajezd WHERE event='" + thisrow+ "' AND year='" + klientClass.Year() + "'"; 
SqlCommand cmd= new SqlCommand(query, spojeni); 
spojeni.Open(); 
SqlDataReader read= cmd.ExecuteReader(); 


if (read.Read()) 
{ 
    maskedTextBox2.Text = read.IsDBNull(24) ? 
     string.Empty : 
     read.GetDateTime(24).ToString("MM/dd/yyyy"); 

在此先感謝。

+3

所以你使用的是SELECT *,你所追求的列是第24列?這是一種糟糕的編碼方式 - 當有人改變表格時會發生什麼(例如在1-23之間添加一列)?您可能會收到錯誤消息,或者您可能會碰到不同的日期時間欄,但沒有注意到。另外,你喜歡SQL注入嗎?請使用參數化查詢。像這樣的動態SQL就是爲什麼每天都有很多SQL注入漏洞的原因。 –

+0

@NathanKoop在你的編輯中你添加了一個大括號。大概你是對的,但正如你從下面的評論中可以看出的那樣,這給OP所使用的查詢提供了非常具體的含義。如果OP只需要一列,那麼更好的方法是可能的。 – Steve

+0

@遺憾的是延遲響應。我沒有看到您所引用的評論,但我刪除了該捲曲。這對我來說不是什麼大不了的,如果它存在或不存在:-) –

回答

14

您正在尋找SqlDataReader.GetOrdinal

根據MSDN

獲取列的順序,在給定列的名稱。

if (read.Read()) 
{ 
    int colIndex = read.GetOrdinal("MyColumnName"); 
    maskedTextBox2.Text = read.IsDBNull(colIndex) ? 
        string.Empty : 
        read.GetDateTime(colIndex).ToString("MM/dd/yyyy"); 

} 

作爲一個側面說明,您的查詢是開放的SQL注入。不要使用字符串連接建立一個SQL命令,但使用參數化查詢

string query = "SELECT * FROM zajezd WHERE [email protected] AND [email protected]"; 
    using(SqlCommand cmd= new SqlCommand(query, spojeni)) 
    { 
    spojeni.Open(); 
    cmd.Parameters.AddWithValue("@p1",thisrow); 
    cmd.Parameters.AddWithValue("@p2",klientClass.Year().ToString()); 
    using(SqlDataReader read= cmd.ExecuteReader()) 
    { 
     ...... 
    } 
    } 
+0

Downvoter,你能解釋我錯過了什麼嗎? – Steve

+0

我沒有downvote,但如果我這樣做,我會做循環以外的閱讀。編輯:只是看到這是一個'if'語句不是一個循環。我想他應該使用ExecuteScaler。 –

+0

我們假設OP只需要一列,但是這不能從發佈的不完整代碼中驗證,但是如果OP真的只需要一條記錄中的一列,我同意整個查詢應該被重寫 – Steve

7

我會嘗試通過(string)(reader["ColumnName"] == DBNull.Value ? "" : reader["ColumnName"]);列名做到這一點。

+0

OP需要使用IsDBNull,並且不能使用列名執行.... – Steve

+0

這是我們做的和工作正常(string)(reader [「ColumnName」] == DBNull.Value?「」:reader [「ColumnName」]); –

+0

好吧,這是正確的,但爲什麼你不添加到你的答案呢? – Steve

相關問題