2012-09-29 118 views
1

我在C#下面的代碼:SQL的數據庫在C#中選擇

string query = "SELECT * FROM Zboruri WHERE cod_aeroport = " + country; 

using (var command = new SqlCommand(query, connection)) 
{ 
    var list = new ArrayList(); 
    var reader = command.ExecuteReader(); 

    if (reader.HasRows) 
    { 
     while (reader.Read()) 
     { 
      string data1 = reader.GetString(1); 
      string data2 = reader.GetString(2); 
      list.Add(cod_aeroport); 
      list.Add(data1); 
      list.Add(data2); 
     } 
    } 
    else 
    { 
     string raspuns = "nu este info"; 
     list.Add(raspuns); 
    } 

    reader.Close(); 
    connection.Close(); 
    return list; 
} 

我的數據庫表有這些列:

data1(numeric(18,0)) 
data2(numeric(18,0)) 
........... 

,它給我的錯誤:

Index was outside the bounds of the array.

關於此行的代碼:

string data2 = reader.GetString(2); 

我該如何解決錯誤?

+0

如果你的'SELECT'返回兩列 - 這些都是列#0和#1 - 沒有列#2 .... –

+1

參數多態查詢 - 你容易受到SQL注入 – Lucero

+2

此外,ArrayList的這些天被認爲是很好的呃老派。如果您使用.NET 2.0或更高版本,請查看通用列表('List ')。 – tomfanning

回答

5

指數從0開始,而不是1

string data1 = reader.GetString(0); 
string data2 = reader.GetString(1); 
3

,我會更喜歡使用的名字從表中檢索列,因爲它提供了更多的描述比使用列的index這通常是原因index out of bounds exception

前,

string data1 = reader["colName1"].ToString(); 
string data2 = reader["colName2"].ToString(); 

邊注:請不要使用parameters在您的查詢,

string query = "SELECT * FROM Zboruri WHERE cod_aeroport = @country"; 

,你叫ExecuteReader加入這一行之前,

command.Parameters.AddWithValue("@country", country); 
var reader = command.ExecuteReader(); 
1

你應該更好地通過名稱訪問它們,通過使用GetOrdinal()方法首先,使由名稱解析索引如果查詢稍後擴展,代碼不會中斷。

if (reader.HasRows) 
{ 
    int data1Index = reader.GetOrdinal("data1"); 
    int data2Index = reader.GetOrdinal("data2"); 
    while (reader.Read()) 
    { 
     string data1 = reader.GetString(data1index); 
     string data2 = reader.GetString(data2index); 
     list.Add(cod_aeroport); 
     list.Add(data1); 
     list.Add(data2); 
    } 
} 

請注意,這是更好的方法相比,使用指定的索引,因爲它避免了仰視上每一行的索引。

此外,請參數化查詢以避免SQL注入。

+0

for column:data1(numeric(18,0))它使用reader.GetOrdinal(), bat如果column:name(nvarchar(50))應該怎麼樣? – Igor

+0

@Igor,'GetOrdinal()'只是將列名映射到您需要用於'GetXxx()'方法的索引 - 列的類型在那一點上是不相關的。 – Lucero

1

索引是從零開始的,所以第一列是0,第二列是1.你應該真的使用列的命名版本;

string data1 = reader["data1"].ToString(); 

一件事,你應該參數化查詢以避免SQL注入的問題,在這種情況下,它幾乎爲原始查詢和更安全簡單。它還有助於數據庫在類似的查詢中節省相當多的時間和內存;

string query = "SELECT * FROM Zboruri WHERE cod_aeroport = @country"; 
using (var command = new SqlCommand(query, connection)) 
{ 
    command.Parameters.AddWithValue("@country", country); 
    var list = new ArrayList(); 
    ... 
+0

謝謝你的幫助,你的建議對我有幫助! – Igor

+0

@ user1582145您應該找到對您的問題最有幫助的答案,並將問題標記爲通過該答案解決,這將有助於他人在此網站上找到更好的解決方案。 –