3

私の問題は、これが機能しないことです。

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"]);
}

最初の問題は、リーダーが読み取るデータを見つけられないことです。わかります。

「データが存在しない場合の無効な読み取り試行です。」

誰でも理由がわかりますか?

4

3 に答える 3

17

NextResult() は、リーダーをクエリから返される次の結果セットに進めます。あなたが書いた方法では、最初の結果セット(おそらく唯一のもの)をスキップします。

あなたが望むと思うパターンは次のとおりです。

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

これにより、結果があるかどうかがチェックされ、ある場合は、読み取るものがなくなるまで各結果セットの結果が読み取られます。

編集:コメントに基づく:

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();
于 2010-02-22T22:49:09.687 に答える
4

上記のtvanfossonの回答からのコード:

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

代わりに次のようにする必要があります。

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

前のコード例で例外をスローする行のない結果セットが存在する可能性があります。さらに悪いことに、最初の結果セットには行がない可能性があり、その後の結果セットは読み取られません。

しかし、HasRowsが使用される理由と方法を教えてくれてありがとう。

于 2012-09-13T20:13:41.093 に答える
4

NextResult は、リーダーからの次の結果セットに移動します。おそらく、結果セットは 1 つしかありません。

于 2010-02-22T22:49:26.010 に答える