0

私の同僚は、経験がなかったにもかかわらず、C# でプログラミングを開始するのを手伝ってくれましたが、気に入っています。私たちが両方とも修正できないいくつかの問題に遭遇するまで、すべてがうまくいきました. 彼自身は SQL を使用していますが、私は LINQ から始めました。

LINQ クエリを実行するには、次のオブジェクトを使用します: _oDBConnection (clsApplication.cs 内) したがって、プログラムを開くと、このオブジェクトが構築されます。しかし、それはいくつかの問題を引き起こします:

  • 新しいオブジェクトを保存する (データをテーブルに入れる) ときに、それらの値をクエリで読み込むことができません。プログラムを再起動する必要があります。
  • プログラムの 2 つのインスタンスを実行している場合、一方が他方で変更されたときに最新の値を取得していません (ただし、変更されたものではなく、新しい値が表示されます!)

これらの問題によると、clsApplication._oDBConnection.tblTAble を 2 回目に呼び出すと、db に再度リンクするのではなく、古い db-states が返されると結論付けることができます。

これは彼が構築したコードです:

public static DBReservationDataContext _oDBConnection;
private static frmMain _fMain;
public clsApplication()
{
    Thread.CurrentThread.Name = "main";
    clsErrorLog.ErrorLocation = "C:\\Software\\ErrorLog";
    clsErrorLog.setPassword("*****");
    clsErrorLog.LockApplication += new clsErrorLog.dLockApplication(lockApplication);

    _oDBConnection = new DBReservationDataContext();

    _fMain = new frmMain();
    _fMain.Show();
}

この問題を解決するにはどうすればよいですか?

例:

データベースには存在しますが、id == iID を持つエンティティが見つからないため、このクエリでクラッシュします。しかし、iID は正しく、データベースに存在します。クエリは、プログラムを閉じて再起動した後に機能します。その後、clsApplication が再度呼び出されます。

public clsReservationDetail(int iID)
    :this()
{
    _oReservationDetail = (from oReservationDetailQuery in clsApplication._oDBConnection.tblReservationDetails
            where oReservationDetailQuery.ID == iID
            select oReservationDetailQuery).First();
}

thx事前に

4

2 に答える 2

0

static キーワードを使用すると、AppDomain ごとに 1 つの参照を持つことができます。これは、DataContext インスタンスを使用する間違った方法です。

DataContext の各インスタンスは、認識したオブジェクトを追跡します。これは一貫性のためです。あるクエリから CustomerID = 4 の Customer インスタンスを取得した場合、CustomerID = 4 レコードを返す別のクエリから同じ Customer インスタンスを取得する必要があります。

データベースの変更を確認したい場合は、

1) datacontext に変更の追跡を停止するように指示します。これは最初のクエリの前に実行する必要があり、datacontext インスタンスが実行できなくなりますSubmitChanges(それらを追跡できなくなるため)。

また

Refresh2)変更されたと思われる各インスタンスに datacontext を伝えます。その場合、ローカルの変更とリモートの変更の間の競合を解決する方法を指定する必要があります。この競合を解決する最も簡単な方法は、ローカルの変更を行わないことです。

また

3) (正しい方法) 新しい DataContext インスタンスを作成し、それを使用してレコードをロードします!

また、注意: DataContext は を実装IDisposableしているため、例外が発生した場合でも、各インスタンスの処理が完了したら呼び出す必要がDisposeあります。ブロックはそれを実現するための良い方法です。using

于 2012-06-15T21:05:22.737 に答える
0

データ コンテキストには、Refreshキャッシュされた結果をクリアするメソッドがあり、クエリを問題なく完了できるはずです。

于 2012-06-15T20:25:03.370 に答える