sql большое чтение данных - PullRequest
       3

sql большое чтение данных

1 голос
/ 28 февраля 2012

Мне нужно прочитать таблицу sql с примерно 100 столбцами, а затем проверить каждую ячейку, чтобы убедиться, что данные не равны NULL.Используя SQLReader, он генерирует исключение IndexOutOfBoundsOfArrway в столбце № 70. Любая идея, как мне достичь цели?PS Я делаю это в c #

Это мой код:

conn = new SqlConnection(connString);
conn.Open();
SqlCommand cmd = new SqlCommand( "select * from tableName where column1='" + 
                                 textBox1.Text+"'", conn);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
   for (int i = 3; i < 100; i++)
   {
      if (reader[i].ToString() != "")
      {
          listBox2.Items.Add(reader[i].ToString());
      }

    }
 }

РЕДАКТИРОВАТЬ: я уверен, что моя таблица имеет 100 столбцов, но reader.FieldCount равен 70

Ответы [ 3 ]

3 голосов
/ 28 февраля 2012

DataReader имеет следующую информацию столбца свойств:

FieldCount - returns the number of columns in the result set.

используйте его и сначала проверьте, получаете ли вы 100 столбцов или нет.

Чтение: SqlDataReader.FieldCount Недвижимость

2 голосов
/ 28 февраля 2012

Попробуйте этот более динамичный подход, он будет работать независимо от количества столбцов:

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());      
  }
}
0 голосов
/ 28 февраля 2012

Вместо выполнения цикла for в каждой строке вы можете вместо этого выполнить foreach для каждого столбца в строке.Это предотвратит эту проблему, и количество столбцов не будет жестко закодировано в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...