0

コントローラでデータベース接続を開き、開いた接続をモデルに渡して、その接続を使用します。

ただし、2回目にコントローラー(Ajax)を呼び出すと、「接続が開いている必要があります」というエラーメッセージが返されます。ページをリロードし、コントローラーを再度呼び出すと、正常に動作します。ただし、2回目の呼び出しでは、そのエラーメッセージが返され続けます。

私のコントローラーにはDB接続を開くためのコードがあるので、処理(呼び出し)ごとにデータベースを開く必要があると思いました。(オープン)コードはusing {}ブロックにあるため、使用後は自動的に閉じる必要があります。

しかし、私は間違っていると思います:(

これが私のコードです、

public JsonResult myControllerMethod() // Action Controller
{
    using (AdsConnection conn = new AdsConnection(connString))
    {
    conn.Open();
    AdsTransaction txn = conn.BeginTransaction(); // Begin Transaction
    try
    {
        MyModel mo = new MyModel();
        mo.doProcess(conn); // pass connection to model
        txn.Commit();
        return Json(new { success = true });
    }
    catch (Exception e)
    {
        txn.Rollback();
        return Json(new { success = false, message = e.Message });
    }
    }
}

MyModel

public void doProcess(AdsConncection conn){ // Model
    try{
        ..
        //AdsCommand select, update, delete and insert....
        ..
    }catch(Exception e){
        throw e;
    }
}

誰か知っている、私が間違っていることは?アドバイスしてください。

ありがとう

4

1 に答える 1

0

ビューにデータベース接続を渡さないでください。ビューは、「ソリッド」データを含むオブジェクトを(モデルとして)受け入れる必要があります。ビューには独自のロジックがあってはならず、モデルのロジックは、検証(検証ではなく)や内部データ変換の実行など、内部状態の変更のみに関係する必要があります。データベースからモデルを設定するタスクは、コントローラーまたは別のマッピングクラスによって実行する必要があります(または、モデルのある種の「Populate」メソッドによって実行する必要がありますが、このメソッドを呼び出して、コントローラーのアクションメソッドに含める必要があります)。

using()とはいえ、発生している問題は、ブロックを使用しているためです。using()ブロックは常にIDisposable.Dispose()そのサブジェクトオブジェクトのメソッド(この場合はDB接続)を呼び出します。SqlConnection.Disposeそのメソッドを呼び出し.Closeます。これが、メソッドが戻るたびに接続オブジェクトが閉じられる理由です。

于 2012-09-25T20:52:54.900 に答える