1

次の投稿は、phxsoftware(http://sqlite.phxsoftware.com)によるSystem.Data.SQLiteデータプロバイダーに関連しています。

DbDataReaderのReadメソッドやVisualStudio2008に質問(およびおそらく問題)があります。多くの例で、次のようなものが表示されます(このコードはあまり意味がないことを知っています...しかし、それは役立ちます目的):

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();

最初の質問-この例から私が理解していないのは、reader.Read()を事前に呼び出して、whileループで初めてデータが欠落しているということです。たとえば、リーダーに値(3,5,7,9)がある場合、cmd.ExecuteReader()から返されたリーダーは最初は3を指しているはずです、正しいですか?その後、reader.Read()は、whileループ内の後続の呼び出しで5、7、および9に移動します。しかし、reader.Read()は最初の「ltemp + = ...」行の前に呼び出されるため、最初の結果(3)をスキップしますか?

2番目の質問-(そしてこれはVSのバグかもしれないと思い始めています)「if(null!= ...」行のブレークポイントで停止したときに、デバッガーでこのコードのセットをステップスルーすると、Iリーダーに複数の行データ値が割り当てられているポップアップで、マウス操作とドリルダウンを明確に確認できます。ただし、そのポップアップ情報を閉じてから元に戻そうとすると、ドリルダウンすると次の行が表示されます。以前は明らかにデータがあった「列挙では結果が得られなかった」。

誰かがこの振る舞いを説明できますか?

4

1 に答える 1

1
  1. ExecuteReaderを実行した後は、このように考えてください。セットは行-1にあります。行0に到達するには、読み取りを実行する必要があります。

  2. IDataReaderは順方向のみの構造であり、反復できるのは1回のみで、デバッガーが反復します。

一般的な質問:

  • なぜロック?
  • リーダーのnullチェックを行う理由-選択後にExecuteReaderがnullを返す問題を認識していません。
  • table1から「SELECTSUM(col1)」を実行してみませんか
  • なぜdisposeパターンに従わないのですか?
于 2009-06-17T01:15:09.757 に答える