3

コンパクトなフレームワーク アプリケーションで sqlite を使用して、システムにイベントを記録しています。System.Data.SQLiteも使用しています。イベントには、発生時刻を表すタイム スタンプがあります。このタイムスタンプをティックとしてテーブルに保存しています。この列に加えて、テーブルには整数/テキスト型の別の 5 つの列が含まれています。以下はテーブルスキーマです

CREATE TABLE T1 (TimeStamp INTEGER, Col2 INTEGER, Col3 INTEGER, Col4 INTEGER,
                      Col5 INTEGER, Col6 TEXT, PRIMARY KEY(TimeStamp DESC));

以下のクエリでADOを使用して、2つのタイムスタンプ間のデータをクエリしています

SELECT TimeStamp,Col1,Col2,Col3,Col4,Col5 FROM T1 WHERE TimeStamp 
BETWEEN @startDate AND @endDate LIMIT 2000;

ユーザーが指定したタイム スタンプをティックに変換し、'@startDate' と '@endDate' のパラメーター値として送信しています。

上記のクエリを実行した後、while ループを使用して SqLiteDataReader を反復処理し始めました。この while ループは決して出てこず、無限に実行し続けることがわかりました。理想的には、2000 レコードを読み取った後に終了する必要があります。以下はコードスニペットです。

SQLiteDataReader dr = cmd.ExecuteReader();

    while(dr.Read())
    {
        :
        : Fill the data from column into Event class object
        :
    }

誰かが同じ問題に直面したかどうか教えてください。

編集:-調査の結果、この問題は完全にロードされたシステムで発生することがわかりました。フルロードシステムの環境をシミュレートし、試着しました。

4

1 に答える 1

0

LIMIT 2000SQL から を削除し、次のように読み取りロジックをわずかに変更して、別の方法でいつでも解決できます。

var dr = cmd.ExecuteReader();
var rows = 0;

while(dr.Read())
{
    if(++rows > 2000) break;

    //
    // Fill the data from column into Event class object
    //
}
于 2013-01-03T15:12:53.310 に答える