phxsoftware System.Data.SQLite DbDataReader плохо себя ведет - PullRequest
1 голос
/ 17 июня 2009

Следующая запись относится к поставщику данных System.Data.SQLite от phxsoftware (http://sqlite.phxsoftware.com)

У меня есть вопрос (и, возможно, проблема) с методом Read DbDataReader и / или Visual Studio 2008. Во многих примерах я вижу такие вещи, как (и я знаю, что этот код не имеет большого смысла ... но это служит цели):

DbDataReader reader = null;
Long ltemp = 0;
lock (m_ClassLock)
{
   DbCommand cmd = dbCnn.CreateCommand();
   cmd.CommandText = “SELECT col1 FROM table1”;
   reader = cmd.ExecuteReader();

   if (null != reader)
   {
      while (reader.Read())
      {
         ltemp += (long)reader[0];
      }
   }
reader.Close();

Первый вопрос. Что я не понимаю из этого примера, так это то, что я пропускаю данные в первый раз в цикле while, вызывая метод reader.Read () заранее? Например, если читатель имеет значения (3,5,7,9), возвращаемый читатель из cmd.ExecuteReader () должен изначально указывать на 3, правильно? Затем reader.Read () переместится на 5, 7 и 9 при последующих вызовах в цикле while. Но поскольку reader.Read () вызывается до первой строки «ltemp + = ...», пропускаю ли я первый результат (3)?

Второй вопрос - (и я начинаю думать, что это может быть ошибкой в ​​VS) Если я перейду через этот набор кода в отладчике, когда остановлюсь на точке останова на «if (null! = ...») "Я могу ясно видеть, как мы размышляем и всплываем во всплывающем окне, что считывателю назначено несколько значений данных строки. Однако, если я закрою эту всплывающую информацию, а затем попытаюсь восстановить ее, когда я сверну, я сейчас см. строку «Перечисление не дало результатов», где ранее были четко данные.

Кто-нибудь может объяснить это поведение?

1 Ответ

1 голос
/ 17 июня 2009
  1. Подумайте об этом так, как только вы запустите ExecuteReader, набор находится в строке -1. Вам нужно выполнить Read, чтобы попасть в строку 0.

  2. IDataReader - это структура только для пересылки, вы можете перебирать ее только один раз, отладчик перебирает ее.

Общие вопросы:

  • Почему замок?
  • Почему проверка на нулевое значение для читателя - я не знаю каких-либо проблем, когда ExecuteReader возвращает нулевое значение после выбора.
  • Почему бы не "ВЫБРАТЬ СУММУ (col1) из таблицы1
  • Почему вы не следуете шаблону утилизации?
...