2010-02-22 3 views
3

Моя проблема в том, что это не работает;Почему данные не найдены после вызова SqlDataReader.NextResult?

while (reader.Read()) 
{ 
    if (reader.NextResult() == true) 
    { 
     json.AppendFormat("{{\"AvgDate\": \"{0}\"}},{{\"MarkerID\": \"{1}\"}},", reader["AvgDate"], reader["MarkerID"]); 
    } 

Но это работает;

while (reader.Read()) 
{ 
    json.AppendFormat("{{\"AvgDate\": \"{0}\"}},{{\"MarkerID\": \"{1}\"}},", reader["AvgDate"], reader["MarkerID"]); 
} 

Проблема с первым заключается в том, что читатель не находит никаких данных для чтения. Я получил;

«Неверная попытка прочитать, когда нет данных ».

Может ли кто-нибудь понять, почему?

+1

Пожалуйста, измените название этого вопроса на вопрос. «Проблема SqlDataReader» крайне неинформативна. Как насчет «Почему данные не найдены после вызова SqlDataReader.NextResult?» или похожие? –

+0

@KennyEvitt Каков исходный вопрос, если вы помните? Хороший звонок, чтобы сделать его более удобным для поиска. – Mukus

ответ

16

NextResult() заставляет читателя перейти к следующему набору результатов, возвращаемому из запроса. Как вы его написали, он пропустит первый набор результатов (скорее всего, единственный).

Узор Я думаю, что вы хотите есть:

if (reader.HasRows) 
{ 
    do 
    { 
     while (reader.Read()) 
     { 
      ... 
     } 
    } 
    while (reader.NextResult()); 
} 

Это будет проверять, есть ли какие-то результаты, и если да, то читать результаты в каждый результирующий набор до тех пор, пока больше не слева, чтобы читать.

EDIT: На основе комментариев:

Для JSON, следует использовать список временных объектов, то DataContractJsonSerializer:

public class DateClass 
{ 
     public string AvgDate { get; set; } 
     public int MarkerID { get; set; } 
} 

... 

var dates = new List<DateClass>(); 
if (reader.HasRows) 
{ 
     while (reader.Read()) 
     { 
      var date = new DateClass { AvgDate = reader["AvgDate"].ToString(), MarkerID = (int)reader["MarkerID"] }; 
      dates.Add(date); 
     } 
} 

var stream = new MemoryStream(); 
var serializer = new DataContractJsonSerializer(typeof(DateClass)); 
serializer.WriteObject(stream, dates); 
stream.Seek(0, SeekOrigin.Begin); 
return stream.ToString(); 
+4

+1. Разъясняя, «набор результатов» можно рассматривать как таблицу. NextResult() требуется только тогда, когда оператор SQL возвращает несколько таблиц. – David

+0

Ах, я вижу. Это объясняет все. Однако для этого класса не существует метода HasResults. Любое предложение о том, как действовать без него? Я не могу найти какой-либо полезный метод на самом деле, но, возможно, я что-то пропускаю – cc0

+0

@ cc0 - Да, правильная функция - читатель.HasRows() not HasResults(). Он сообщает вам, возвращает ли ваш набор результатов какие-либо строки или нет. Если строки не возвращаются, а вы читаете reader.Read(), вы получите исключение, поэтому всегда нужно проверять reader.HasRows() перед вызовом функции reader.Read(). – jaywon

4

NextResult принимает вас на следующий набор результатов от чтения. Вероятно, у вас есть только один набор результатов.

3

код от ответа tvanfosson в выше:

if (reader.HasRows) 
{ 
    do 
    { 
     while (reader.Read()) 
     { 
     ... 
     } 
    } 
    while (reader.NextResult()); 
} 

вместо этого должен быть:

do 
{ 
    if (reader.HasRows) 
    { 
     while (reader.Read()) 
     { 
      ... 
     } 
    } 
} while (reader.NextResult()); 

Там может быть результатом множества без строк, которые вызывали бы предыдущий пример кода бросить исключение. Хуже того, первый набор результатов не может содержать строк, а последующие результирующие множества тогда не будут считаться.

Но спасибо, что сообщили мне, почему и как используется HasRows.