Попробуйте этот более динамичный подход, он будет работать независимо от количества столбцов:
while (reader.Read())
{
// not sure why you started at 3,
// this code is generic so it will also work for tables with less that 3 columns
// but maybe that is something you can omit
for (int i = 0; i < reader.FieldCount ; i++)
{
if (reader[i] == null)
continue;
listBox2.Items.Add(reader[i].ToString());
}
}
Вы также можете рассмотреть возможность удаления нулевой проверки из реальной процедуры чтения, поскольку цикл по столбцам занимаетЗначительное количество времени и ваша блокировка считывателя при этом.
Однако, в зависимости от количества строк, ваше чтение в этом может привести к новым проблемам в отношении потребления памяти.
UPDATE
Чтобы избежать извлечения каждого столбца отдельно по индексу, вместо этого используйте пакетную операцию GetValues()
для DataReader
, которая возвращает массив объектов со всеми значениями, даже если вы ожидаете только одну строку, используйтеесли вместо того, чтобы избежать проблем:
if (reader.Read())
{
var values = new object[reader.FieldCount];
reader.GetValues(values);
for (int i = 0; i < values.Count ; i++)
{
if (values[i] == null)
continue;
listBox2.Items.Add(values[i].ToString());
}
}