2014-02-26 141 views
1

我很難過,我試圖從數據庫中填充5個文本框,並非所有5個都會有數據。用ExecuteReader循環遍歷行

實施例:

ID | ItemID | QType

1 | 10 | 2盒

2 | 10 | 6盒

3 | 11 | 1案例

在這個例子中,它將填充QuantityType1TxtBox與2 Boxes和QuantityType2TxtBox與6 Boxes,而其他三個文本框留空。

當我嘗試運行此代碼時,出現以下錯誤:索引超出了數組的範圍。

此錯誤發生在此行上:QuantityType2TxtBox.Text = rdr.GetString(1);

SqlCommand cmd = new SqlCommand(@"SELECT QType FROM InventoryQType 
               WHERE ItemID = '" + itemID + "'", conn); 
conn.Open(); 
SqlDataReader rdr = cmd.ExecuteReader(); 

while (rdr.Read()) 
{ 
    QuantityType1TxtBox.Text = rdr.GetString(0); 
    QuantityType2TxtBox.Text = rdr.GetString(1); 
    QuantityType3TxtBox.Text = rdr.GetString(2); 
    QuantityType4TxtBox.Text = rdr.GetString(3); 
    QuantityType5TxtBox.Text = rdr.GetString(4); 
} 
rdr.Close(); 
+0

您的數據中只有一個字段,所以GetString(0)之後的任何內容都不應起作用。 – LarsTech

+0

您是否期望獲得5條記錄? –

+2

另外,總是使用參數來避免sql注入。您的ItemID應該使用您傳遞值的參數。 – LarsTech

回答

7

我不確定我的switch語句是否正確地做到這一點,但我認爲這段代碼的其餘部分對於向您顯示參數和使用語句很有用。

string sql = @"SELECT QType FROM InventoryQType WHERE [email protected]"; 
using (SqlConnection conn = new SqlConnection("[put your connection string here, or reference to web.config]")) { 
    conn.Open(); 
    using (SqlCommand cmd = new SqlCommand(sql, conn)) { 
     cmd.Parameters.Add("@id", System.Data.SqlDbType.VarChar).Value = itemID; 
     SqlDataReader rdr = cmd.ExecuteReader(); 
     int loop = 1; 
     while (rdr.Read()) { 
      switch(loop){ 
       case 1: 
        QuantityType1TxtBox.Text = (string)rdr["QType"]; 
        break; 
       case 2: 
        QuantityType2TxtBox.Text = (string)rdr["QType"]; 
        break; 
       case 3: 
        QuantityType3TxtBox.Text = (string)rdr["QType"]; 
        break; 
       case 4: 
        QuantityType4TxtBox.Text = (string)rdr["QType"]; 
        break; 
       case 5: 
        QuantityType5TxtBox.Text = (string)rdr["QType"]; 
        break; 
       default: 
        break; 
      } 
      loop++; 
     } 
    } 
    conn.Close(); 
} 

此外值得注意的是,您的itemID似乎是您的示例中的varchar。我假設它實際上是一個int,所以如果這是真的,你需要將參數的'VarChar'部分改爲'Int'。

+0

這很好,我不得不在那裏添加ExecuteReader,但除此之外,工作就像一個魅力。我現在正在將我的所有參數切換到參數。感謝您的提示,我非常感謝。 – techora

+0

哎呀,在ExecuteReader上很好的捕捉。我爲未來的觀衆添加了這個例子。祝你好運! – JClaspill

2

您使用的檢索數據的SQL查詢只返回QType領域,因此SqlDataReader中只有1列。

因爲您通過調用rdr.GetString(1)來請求第二列,所以會出現索引超出範圍異常。

我會編輯你的select語句來命名每個你想放在每個文本框中的字段,這樣索引就可以像你期望的那樣工作。最後,如果您使用上面的代碼檢索多於一行的數據,則在此方法結束時,文本框將包含最後一條記錄的數據 - 這是因爲您之前的記錄會被覆蓋,因爲您重複分配每個文本框的Text屬性。

0

修正你的代碼是這樣的:

var values = new List<string>(); 
while (rdr.Read()) 
{ 
    values.add(rdr.GetString(0)); 
} 
3

很多方法可以做到這一點,但原油的實現,讓你開始可能看起來像:

List<string> values; 
while(rdr.Read()) 
{ 
    values.Add(rdr.GetString(0)); 
    if (values.Count == 5) break; 
} 

if (values.Count > 0) QuantityType1TxtBox.Text = values[0]; 
if (values.Count > 1) QuantityType2TxtBox.Text = values[1];  
if (values.Count > 2) QuantityType3TxtBox.Text = values[2]; 
if (values.Count > 3) QuantityType4TxtBox.Text = values[3]; 
if (values.Count > 4) QuantityType5TxtBox.Text = values[4]; 

你可能要考慮( a)將你的數據訪問代碼分離成一個單獨的返回值列表的類/方法,(b)將你的文本框放入一個集合中,這樣你就不需要重複的代碼來爲它們賦值。