SqlDataReader результаты не так, как ожидалось - PullRequest
1 голос
/ 01 декабря 2019

Из-за деликатного характера запроса и даже информации я не могу предоставить точный код. Поэтому я предоставлю представительный набор кода. Я могу разобраться в проблеме, если пойму, почему она работает так, как она делает. Так что я знаю, что нет ничего с SQL. Но при запуске через C # он возвращает только последний ряд. Вот что я устраняю.

Необходимость

Заказчик хочет, чтобы все результаты таблицы (с ограничениями, управляемыми в другом месте) были отправлены в файл. Я делаю это в коде, потому что он выполняется другим приложением.

using (SqlDataReader reader = cmd.ExecuteReader())
{
   while (reader.Read())
   {
      using (writer = new StreamWriter(output))
      {
         // Some StringBuilder code gets info from the reader and appends to a string called line

         writer.WriteLine(line)

      }
   } 
}

Теперь я читаю этот код, чтобы сказать: «Хорошо, пока вы читаете строки, вы идетеиспользовать этот StreamWriter и записать каждую строку в файл с новой строкой ".

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

Я добавил RecordsReturned и возвращает мне -1,но когда это делается в цикле, я вижу, что он возвращает тот же результат x точное количество записей в наборе записей.

Я подозреваю, что это выполняется с помощью шага ExecuteReader (), где он уже считывает результаты. Мой вопрос: верна ли моя теория, и если да, то почему? Функция read () из SqlDataReader при запуске в цикле while должна давать мне каждую строку по порядку для каждого выполнения, и в соответствии с Intellisense это верно. Так что либо мое предположение неверно, либо я что-то упускаю.

Есть идеи?

1 Ответ

0 голосов
/ 01 декабря 2019

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

using (SqlDataReader reader = cmd.ExecuteReader()) {
    if(reader.HasRows) {
        using (var writer = new StreamWriter(output)) { //<-- writer created once
            while (reader.Read()) {
                // Some StringBuilder code gets info from the reader
                // and appends to a string called line

                writer.WriteLine(line);
            }
        }
    } 
}
...