Asp.net MVC3,开放连接

时间:2012-09-25 20:49:43

标签: asp.net-mvc advantage-database-server

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

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

我的控制器有代码打开数据库连接,所以我相信,它应该为每个处理(调用)打开数据库。并且(开放)代码在使用{}块,因此在使用之后,它应该自动关闭。

但我认为我做错了:(

这是我的代码,

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;
    }
}

有人知道,我做错了什么?请告诉我。

由于

1 个答案:

答案 0 :(得分:0)

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

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