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

索引从 0 开始,而不是 1

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,第二列是 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();
    ...
于 2012-09-29T10:29:33.813 回答