Индекс был за пределами массива, но я не вижу ошибки
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++;
}