2016-07-01 10 views
1
using (var conn = new SqlConnection(connectionString)) 
{ 
    var cmd = new SqlCommand("SELECT * FROM mySchema.MyTable", conn); 
    conn.Open(); 
    var reader = cmd.ExecuteReader(); 
    while(reader.Read()) 
    {... 

В отладчике я вижу, мой читатель имеет одну строку - я могу видеть, возвращенные данные - но reader.Read возвращается false мой код обработки не вызывался.DBReader имеет строки, но Read() возвращает ложь

Это кажется довольно простой «прочитайте строки из таблицы базы данных», так что мне не хватает? Должен ли я напрямую или что-то смотреть на данные строки читателя?

+0

Как именно вы _see_ эта строка в отладчике? На какую недвижимость вы смотрели? Отладчик уже вызвал 'Read()', так что, когда ваш код вызывает его, это 'false'? –

+1

Похоже, что отладчик уже прочитал все данные, а ваш код обнаружил, что данных больше нет. Это работает, если вы не используете отладчик? – hvd

+0

_Seriously_, отладчик может изменить поведение кода таким образом? Как и в случае, если я расширяю «представление результатов» на «читателе», он запускает цикл while (reader.Read()) {...} '? –

ответ

3

Если вы позволите отладчику показать вам результаты, он зачитает читателя и перечислит результат.

Смотрите комментарий в окне отладчика:

Результаты: Расширение Просмотр результатов будет перечислять IEnumerable

Так что ваш отладчик уже считаны все результаты и если вы шаг к reader.Read() там больше нет строк для чтения и Read() возвращает false.


Я просто воспроизвел его с помощью теста litte. Когда мой отладчик читает результаты, мой код больше не может их читать. Если я не позволяю отладчику показывать их, мой код может их прочитать. (qed)

+0

Это, кажется, проблема, но мне все равно сумасшествие для меня, отладчик нарушает поведение программы ... Я могу проверить возвращенные результаты или использовать их, но не и то и другое! Есть ли глупый способ избежать этой проблемы? –

+0

@ Mr.Boy в этом специальном случае, я так не думаю.С другой стороны, зачем вам это нужно. Для отладки вы можете просто установить точки останова внутри цикла 'Read()'. Я думаю, вы можете быть уверены, что 'SqlDataReader' работает правильно, поэтому я не вижу необходимости просматривать результаты вне/до вашего собственного цикла чтения. –

-3

Измените тип считывателя var на SqlDataReader reader = command.ExecuteReader(); и попробуйте это. Он будет работать.

У меня есть пример кода для MYSQL

using (MYSQLCON) 
     { 
      using (MySqlDataReader sdr = sqlcmd.ExecuteReader()) 
      using (YourWriter) 
      { 
       String Header = null; 
       String Content = null; 

       for (int i = 0; i <= sdr.FieldCount - 1; i++) 
       { 
        Header = Header + sdr.GetName(i).ToString() + ","; 
       } 
       YourWriter.WriteLine(Header); 
       while (sdr.Read()) 

        for (int i = 0; i <= sdr.FieldCount - 1; i++) 
        { 
         Content = Content + sdr[i].ToString() + ","; 
         if (i == sdr.FieldCount - 1) 
         { 
          YourWriter.WriteLine(Content); 
          Content = null; 
         } 
        } 
      } 
     } 
+0

'var' - это просто синтаксический шьюгер. Компилятор знает, что он работает на 'SqlDataReader'. Это не имеет никакого отношения к поведению, наблюдаемому ОП. –

+0

@ RenéVogt, попробуй это свойство 'reader.HasRows' –

-1

Вы можете попробовать SELECT 1;, чтобы испытать вас читателя. У вас есть SqlManagement Studio? Чтобы проверить запрос.

Это работа.

using (var conn = new SqlConnection(connectionString)) 
     { 
      var cmd = new SqlCommand("select 1", conn); 
      conn.Open(); 
      var reader = cmd.ExecuteReader(); 
      while(reader.Read()) 
      { 
       string a = "teste"; 
      } 
     } 

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

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