2009-06-17 7 views
1

次のポストはphxsoftware(http://sqlite.phxsoftware.com)によるSystem.Data.SQLiteデータプロバイダに関係phxsoftware System.Data.SQLite DbDataReaderのDbDataReaderののReadメソッドで私が質問(そしておそらく問題を)持っている

を不正な動作および/または私は、次のようなものを参照してください(と私は、このコードは、多くの意味がありません...しかし、それは目的を果たし知っている)多くの例でのVisual Studio 2008:

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

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

2番目の質問 - (これはVSのバグかもしれないと思っています)私がブレークポイントで "if(null!= .. "私がはっきりとわかるように、ポップアップで複数の行データ値が割り当てられていますが、そのポップアップ情報を閉じると、それを元に戻してみると、私がドリルダウンすると今ラインのデータが以前に明らかに存在した「列挙は何の結果が得られません」。

誰もが、この動作を説明することはできますか?

+0

あなたはこのリーダーアクションをロックするのはなぜ?sqliteは、データの同時選択に対処することができます。更新/削除しますまた、挿入はできませんが、同時に選択することはできません。 – tuinstoel

答えて

1
  1. このAFTEのようにそれについて考えを参照してくださいあなたはExecuteReaderを実行し、セットは行-1にあります。 Read 0を0にするには、Readを実行する必要があります。

  2. IDataReaderはフォワードのみの構造で、一度しか反復処理ができません。デバッガは反復処理を行います。

一般的な質問:

  • なぜロック?
  • なぜnullをチェックするのですか?ExecuteReaderが選択後にnullを返す問題は認識していません。
  • はなぜ「TABLE1
  • からSUM(COL1)を選択なぜ処分パターン以下ではありませんか?
+0

私の質問がクリアされます。1.ドキュメントで、cmd.ExecuteReader()の呼び出し後に0に設定されていることを暗示していたようです。質問2については、デバッガがリストを反復処理していますか?それはデバッガのバグのように聞こえます(変数の検査によってコードの動作を変更します)。おお! 質問 ロック - 貧弱なカットアンドペーストの例 ヌルチェック - 私は同意します sum - これはちょうどサンプルコードでした。 "ltemp + ="私は実際の仕事を取り除き、簡単な話をしました。 処分 - もう一度サンプルコード 洞察に感謝します! –

+0

デバッガで実行されているreコード。ウォッチウィンドウを動作させるために必要な悪行です。参照:http://blogs.msdn.com/jmstall/archive/2005/11/15/funceval-rules。荒々しい詳細のためのaspx –

関連する問題