2014-02-11 2 views
1
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() funciont возвращает 6, значит, есть 6 строк, поэтому 6 полей [0] [1] [2] [3] [4] [5] Я поставил точку останова в цикле for и получаю ошибку во втором цикле, когда i = 1. Как я могу это исправить? Я не вижу ошибки. Спасибо заранее.Индекс находился за пределами массива, но я не вижу ошибки

+0

Как первая строка компиляции вообще? –

+2

Ваш код основан на неправильном предположении, что команда 'show databases' возвращает один столбец для каждой строки в' information_schema.SCHEMATA'. Это предположение неверно - 'information_schema.SCHEMATA' имеет строку для каждой схемы базы данных, а не для каждого столбца, возвращаемого' show databases'. – dasblinkenlight

ответ

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 
} 
1

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

int i=0; 
if (dataReader.HasRows) 
{ 
    while (dataReader.Read()) 
    { 
     db_name[i] = new TreeNode(dataReader.GetString(0));   
    } 
    i++; 
} 
+1

Просто потому, что это не массив, это не значит, что вы не можете получить доступ к считывателю данных, подобному одному. Если у него не было индексатора, программа не будет компилироваться. MySqlDataReader, вероятно, реализует [IDataReader] (http://msdn.microsoft.com/en-us/library/system.data.idatareader%28v=vs.100%29.aspx), который имеет доступ к столбцам в виде массива. – Dirk

+0

@Drik О, я этого не знал. Спасибо, Дирк – Christos

 Смежные вопросы

  • Нет связанных вопросов^_^