【问题标题】:Asp.net MVC3, open connectionAsp.net MVC3,打开连接
【发布时间】:2012-09-25 20:49:43
【问题描述】:

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

但自从第二次调用控制器(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;
    }
}

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

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答,但我没有将数据库连接传递给 View。它传递给模型(Mvc)。你的意思是,我不能在我的动作控制器中使用 using 块?
    • 对不起 - 我没有仔细阅读你的帖子(所以我的大部分回复都是没有实际意义的)。当您在控制器方法中逐步调试时会发生什么?您应该能够看到您的连接何时关闭。
    • 另外,你能发布异常的堆栈跟踪吗?
    • 哦,我明白了,很抱歉,是错字:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多