2016-12-18 3 views
0

私はタイマーでデータベースに追加されたすべての新しい行を読み込もうとしています。データベースからすべての新しい行を読み込むには?

まず、データベース全体を読み込んでローカルデータテーブルに保存しますが、データベースに追加されたすべての新しい行を読みたいと思います。ここで私は新しい行を読み取るしようとしている方法です:

string accessDB1 = string.Format("SELECT * FROM {0} ORDER BY ID DESC", tableName); 
setupaccessDB(accessDB1); 

int dTRows = localDataTable.Rows.Count + 1; 
localDataTable.Rows.Add(); 

using (readNext = command.ExecuteReader()) 
{ 
    while (readNext.Read()) 
    { 
     for (int xyz = 0; xyz < localDataTable.Columns.Count; xyz++) 
     { 
      // Code 
     } 
     break; 
    } 
} 

のみ1行がタイマーの中に追加された場合、これは正常に動作しますが、複数の行が追加されたとき、これはのみ、最新の行を読み取ります。

追加された行をすべて読み取る方法はありますか。

私はOledbDataReaderを使用しています。事前に

おかげ

+0

AのDataAdapterはあなた – Plutonix

+0

新しい行のためにそれを行うだろう次の行に現在の行と、その後While Loop動きを読み取っ?どのように新しい行を追跡していますか?あなたがそれを "読む"ときにあなたが保管するアイデンティティか何かがありますか? –

+0

いいえを数えるためにクエリを実行します。データベースの行の数を比較し、それを前のnoと比較します。行のもし私が上記のコードを実行した場合、その数が多い場合は –

答えて

1

は、あなたの当面の問題はここにある:

while (readNext.Read()) 
{ 
    doSomething(); 
    break; 
} 

これはあなたのループは、基本的に沸くものです。そのbreakは、そこにいくつのアイテムがあるかにかかわらず、最初のアイテムを処理した後にループを終了しようとしています。

IDの降順でソートしているため、最初の項目がこの場合はおそらく最後の項目になります。

新しく追加された行のみを読み込むという点では、さまざまな方法がありますが、その中には使用しているDBMSによって異なるものもあります。

おそらく最も簡単で移植性の高いものは、行が最初に追加されたときにfalseに設定された追加の列processedを追加することです。

こうすれば、それらのレコードを検索し、それぞれを処理して列をtrueに設定するクエリを作成することができます。

実際、トリガーを使用してこれを行うことができます(挿入時にフラグをfalseに強制する)。これにより更新でも可能です。

トラッキングの削除はもう少し難しいものの、それでも達成できます。処理コードがこれらの詳細にアクセスできるように、レコードを削除する前に実際に別のテーブルにレコードを書き込むトリガーを持つことができます。

+0

私はあなたのコードをしようとすると、データベースからのすべてが新しい行だけではなく読み込まれます。 (私は「中断」を取り除きました)。 Selectステートメントの使い方を学ぶことができるリンクはありますか?これまで、Selectステートメントを他の人がどのように使用したかに基づいて学習しました。 –

+0

@ghostwar、はい、それはあなたのクエリがすべてのレコードを要求するので効果があります。この他の問題を緩和するための可能な方法についての詳細情報を追加しました。 – paxdiablo

1

ほとんどのテーブルでは、主キーは増分値に基づいています。これは1だけインクリメントされる非常に単純な整数ですが、datetimeベースのguidでもかまいません。

とにかく最後のレコードのIDを知っていれば。 「高い」IDを持つすべてのレコードを簡単に尋ねることができます。そうすれば、新しいレコードを得ることができますが、更新されたレコードはどうですか?それらも必要な場合は、datetime値を含む列を使用することもできます。

データベースから削除されるレコードは少し難解です。基本的なクエリではそれらを取得することはできません。キャッシュのようにデータベースから取得するレコードごとにTTLを設定することで、それを解決できます。レコードが「期限切れ」になると、レコードを再度取得しようとします。

Microsoft SQL Serverなどの一部のデータベースでは、この点についてより高度なオプションも提供されています。ブローカサービスを介してクエリ通知を使用することも、データベースの変更追跡を有効にすることもできます。最後のものは、レコードごとの最後のアクション(挿入、更新、または削除)が何であるかを示すことさえできます。

0

次作品

using (readNext = command.ExecuteReader()) 
{ 
    while (readNext.Read()) 
    { 
     abc = readNext.FieldCount; 
     for (int s = 1; s < abc; s++) 
     { 
      var nextValue = readNext.GetValue(s); 
     } 
    } 

} 

For Loop

関連する問題