2009-07-19 5 views
0

こんにちは、以前のレコードが削除された後、WMI情報を取得してデータベースに保存するプログラムがありました。現在、私のプログラムはレコードを10分以上前に削除しており、データベースに新しい情報を入力した後、2分ごとにこれをチェックしています。 2分ごとに実行される別のタイマーでは、データベースに格納された情報がユーザーに表示されます。これは、データベース表に表示されるのと同じ順序で表示されます。LINQを使用してテーブルの最上部にデータベースレコードを追加しました

問題は、新しいレコードがデータベーステーブルの最後に追加されるのではなく、レコードが削除されたときに10分後に新しいデータベースから実行されたときに発生します。また、古いデータの一部が削除された後、すでにデータベースにデータを挿入している既存のデータでプログラムを再オープンした場合にも発生します。

以下、自分のデータがデータベースにどのように追加され、どのように削除されるのかを示すコードを追加しました(これは2つの別々のクラスで発生します)。以下では、私が意味することを理解できるように、いくつかのサンプル出力データを隠しています。

基本的には、データがDateTimeに基づいて収集された順番で表示される必要があるため、これを解決する方法が必要です。何かを見つけられる場合は、これを解決する最善の方法はありませんそれが表示される前にデータをソートしていますか?

DateTime dateTime = DateTime.Now.Subtract(new TimeSpan(0, 0, 10, 0)); 

var result2 = (from b in hddInfo 
       where b.DateTime < dateTime 
       select b).DefaultIfEmpty(); 

foreach (TblHDDInfo record2 in result2) 
{ 
     if (record2 != null) 
     { 
     localDB.TblHDDInfo.DeleteOnSubmit(record2); 
     } 
} 

localDB.SubmitChanges(); 

TblHDDInfo hddInfoAdd = new TblHDDInfo(); 
          hddInfoAdd.DeviceID = deviceID; 
          hddInfoAdd.IpAdd = ipAdd; 
          hddInfoAdd.Size = size; 
          hddInfoAdd.FreeSpace = freeSpace; 
          hddInfoAdd.DateTime = dateTime; 
          localDB.TblHDDInfo.InsertOnSubmit(hddInfoAdd); 

          localDB.SubmitChanges(); 

1回目 HDDサイズ:186ギガバイト 残りのスペース:157ギガバイト 日時:19/07/2009午前17時27分21秒

HDDサイズ:186ギガバイト 残りのスペース:157ギガバイト 日時: 19/07/2009 17時29分二十六秒

HDDサイズ:186ギガバイト 残りのスペース:157ギガバイト 日時:19/07/2009午前17時31分31秒

HDDサイズ:186ギガバイト 残りのスペース:157ギガバイト 日時:19/07/2009午前17時33分36秒

HDDサイズ:186ギガバイト 残りのスペース:157ギガバイト 日時:19/07/2009 17時35分: 41

2回目 HDDサイズ:186ギガバイト 残りのスペース:157ギガバイト 日時:19/07/2009午前17時37分46秒

HDDサイズ:186ギガバイト 残りSPAC E:157ギガバイト 日時:19/07/2009午後05時29分26秒

HDDサイズ:186ギガバイト 残りのスペース:157ギガバイト 日時:19/07/2009 17時31分31秒

HDDサイズ:186ギガバイト 残りのスペース:157ギガバイト 日時:19/07/2009夜05時33分36秒

HDDサイズ:186ギガバイト 残りのスペース:157ギガバイト 日時:19/07/2009 17時35分41秒

第三時間 HDDサイズ:186ギガバイト 残りのスペース:157ギガバイト 日時:19/07/2009 17時39分51秒

HDDサイズ:186ギガバイト 残りのスペース:157ギガバイト 日時:19/07/2009夜五時37分46秒

HDDサイズ:186ギガバイト 残りのスペース:157ギガバイト 日時:19/07/2009午後05時29分26秒

HDDサイズ:186ギガバイト 残りのスペース:157ギガバイト 日時:19/07/2009午前17時31分:31

HDDサイズ:186ギガバイト 残りのスペース:157ギガバイト 日時:19/07/2009 17時33分36秒

答えて

3

なぜちょうどあなたのLINQクエリにORDERBYのb.DateTimeを追加しませんか?

データベースは本質的に順序付けられておらず、挿入物の位置は不確定です。つまり、実際のテーブルの行の位置は、相互作用するときの作業の抽象レベルで意味のない概念ですあなたのコードでDBに対して。順序を適用するには、1つまたは複数のフィールドでDB出力をソートする必要があります。

+0

乾杯私はC#とLINQにはかなり新しいと思いますが、申し訳ありませんがn00bである – manemawanna

+0

皆はいつか学ばなければなりませんでした。がんばろう! – JohnFx

2

データベーステーブルの「トップ」と「ボトム」がないため、達成しようとしていることを100%確信していません。しかし、このコード行...

hddInfoAdd.DateTime = dateTime; 

...私には違うようです。それはDB理論の中心テナントの

hddInfoAdd.DateTime = DateTime.Now; 
+0

申し訳ありません、私はdatetimeを以前に収集しており、すべてのレコードに適用されています – manemawanna

1

一つ...のようにすべきではないデータがソートされていない格納されていることです。アイデアは、人々がデータをソートしたいと思うかもしれない多くの方法があるため、特定のソート順を生のストレージに適用するのは無駄です。 DBMSが未分類のデータを挿入された順番で表示するのは事故/実装の詳細です(そして、常にそうでないケースも見てきました)。

データに特定の順序を付ける場合は、order by節(および場合によってはインデックス)を使用して、その要望を明示的に適用する必要があります。

1

SQLの唯一の順序は、列の値に基づいてORDER BYを使用して適用する順序です。

ALLその他の見かけの行の順序は共起的です。

あなたは、あなたがそれを制御し、それを実装するために、あなたのSELECT文にORDER BYを使用する列を追加する必要があります外観の順序を制御したい場合は。すでに列(dateTime)がある場合は、ORDER BYを追加するだけです。

関連する問題