0

我在我的控制器中打开数据库连接并将打开的连接传递给我的模型以使用该连接。

但自从第二次调用控制器(Ajax)以来,它返回一条错误消息,上面写着“必须打开连接”。我重新加载了页面,然后再次调用控制器然后它运行良好。但是对于第二次调用,它会一直返回该错误消息。

我的控制器有打开数据库连接的代码,所以我相信,它应该为每个处理(调用)打开数据库。并且(打开的)代码在 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 });
    }
    }
}

我的模型

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

有谁知道,我做错了什么?请给我建议。

谢谢

4

1 回答 1

0

您不应该将数据库连接传递给您的视图 - 您的视图应该接受包含“实体”数据的对象(作为模型)。视图不应该有自己的逻辑,模型的逻辑应该只关心修改内部状态,例如执行验证(而不是验证)或一些内部数据转换。从数据库填充模型的任务应该由控制器或单独的映射类(或模型的某种“填充”方法,但该方法应该被调用并包含在控制器的操作方法中)完成。

也就是说,您遇到的问题是因为您正在使用using()块。using()块将始终调用IDisposable.Dispose()主题对象的方法,在本例中为数据库连接。SqlConnection.Dispose调用它的.Close方法,这就是连接对象在方法返回时关闭的原因。

于 2012-09-25T20:52:54.900 回答