Индекс был за пределами массива, но я не вижу ошибки

int n =Count("SELECT COUNT(*) FROM information_schema.SCHEMATA");; //return 6

TreeNode[] db_name = new TreeNode[n];
MySqlCommand cmd = new MySqlCommand("show databases", connection);
MySqlDataReader dataReader = cmd.ExecuteReader();

for(i=0;i<n;i++)
{
    dataReader.Read();
    db_name[i] =  new TreeNode(dataReader[i].ToString());
}  

Почему я получаю исключение IndexOutOfRangeException, индекс находился за пределами массива? Если функция Count() возвращает 6, это означает, что имеется 6 строк, поэтому 6 полей [0] [1] [2] [3] [4] [5] я помещаю точку останова в цикл for и получаю ошибку в второй цикл, когда я =1. Как я могу это исправить? Я не вижу ошибки. Заранее спасибо.

2 ответа

Решение

Призыв к dataReader.Read() переход к следующей доступной записи.

Когда вы звоните dataReader[i]вы, вероятно, пытаетесь получить столбец, которого нет в ваших возвращенных данных. На первой итерации dataReader[i] пытается получить первый столбец, но затем на второй итерации он просто пытается получить второй столбец, затем третий и т. д. Вы, вероятно, не возвращаете 6 столбцов, так что это вызовет исключение.

Вместо этого вы можете попробовать что-то вроде этого, предполагая, что каждая запись является просто строкой:

for(i=0; i<n; i++)
{
    dataReader.Read();
    db_name[i] =  new TreeNode(dataReader.GetString(0));

          // or use dataReader[0].ToString(), but don't change the index of 0
}

Пожалуйста, попробуйте следующее.

int i=0;
if (dataReader.HasRows)
{
    while (dataReader.Read())
    {
        db_name[i] =  new TreeNode(dataReader.GetString(0));          
    }
    i++;
}
Другие вопросы по тегам