0

LINQ を使用してデータベースにアクセスし、レコードを変更しています。次のようにレコードを取得します。

using(var db = new DatabaseDataContext(connectionString))
{
    var query =
        from item in db.table
        where item.senddate == null
        select item;

    results = query.ToList();
}

アイテムを取得した後、各アイテムを処理します。これには Web サービスとの通信が必要で、レコードごとに 1 分以上かかる場合があります。レコードが更新されたら、変更を送信する必要がありますが、どのように進めればよいかわかりません。現在、私は次のことを行っています。

List<table> toProcess = QueryDb();  // Calls the previously displayed method

foreach (table item in toProcess)
{
     item.result = QueryDb(item.xmlrequest);
     PostToDb(item);
}

...

private bool PostToDb(table submit)
{
    submit.senddate = DateTime.Now;

    using (var db = new DatabaseDbDataContext(connectionString))
    {
        db.SubmitChanges();
    }

    return result;
}

db.SubmitChanges()変更を送信しませんが、オブジェクト「送信」が変更を保持するように実際に設定していません。ファイルが一度に 1 つずつ処理される間、Db 接続を数分間開いたままにせずに、エントリに加えられた変更を送信するにはどうすればよいですか?

よろしくお願いいたします。

一部解決済み

これが最善の解決策だとは思いませんが、コードに次の変更を加えることで動作させることができました。

private bool PostToDb(table submit)
{
    using (var db = new DatabaseDataContext(connectionString))
    {
        var query =
            from item in db.table
            where item.iprimaryid.Equals(submit.iprimaryid)
            select item;

        //  There can only be one result, but this was the only 
        //  way I could think to access it
        foreach (var item in query)
        {
            item.senddate = DateTime.Now;
            item.result = submit.result;
        }

        db.SubmitChanges();
    }

    return result;
}
4

2 に答える 2

3

Attachのメソッドを使用する必要がありますDataContext。したがって、手順は次のとおりです。

1) 1 つのインスタンスを使用してデータベースからオブジェクトをクエリしますDataContext
。2) いくつかの変更を行います
。3) 新しいDataContextインスタンスを作成し、変更されたエンティティを添付します。

using (var dataContext = new DataContext(ConnectionString))
{
     dataContext.TABLE_NAME.Attach(modifiedEntity);
     dataContext.SubmitChanges();
}
于 2012-07-27T17:57:56.957 に答える
0

外部スコープでデータ コンテキストを宣言し、データベースにアクセスする必要があるメソッドにパラメーターとして渡すことはできますか? このようなもの:

using (var db = new DatabaseDbDataContext(connectionString))
{
    var toProcess = QueryDb(db);

    // Do whatever processing you need to do...

    toProcess.ForEach(t => t.SendDate = DateTime.Now);

    db.SubmitChanges();
}
于 2012-07-27T17:45:44.847 に答える