2

私は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))
...........

そしてそれは私にエラーを与えます:

インデックスが配列の範囲外だった。

このコード行:

string data2 = reader.GetString(2); 

どうすればエラーを修正できますか?

4

4 に答える 4

5

インデックスは 1 ではなく 0 から始まります

string data1 = reader.GetString(0);
string data2 = reader.GetString(1);
于 2012-09-29T10:18:54.123 に答える
4

列を使用するよりも詳細な説明が得られるため、テーブルから取得した列名を使用することをお勧めし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();
于 2012-09-29T10:24:43.157 に答える
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 インジェクションを避けるためにクエリをパラメータ化してください。

于 2012-09-29T10:27:45.573 に答える
1

インデックスは 0 から始まるため、最初の列は 0、2 番目の列は 1 です。ただし、実際には列の名前付きバージョンを使用する必要があります。

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

もう 1 つ、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();
    ...
于 2012-09-29T10:29:33.813 に答える