我在控制器中打开数据库连接,并将打开的连接传递给我的模型以使用该连接。
但是自从第二次调用控制器(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;
}
}
有人知道,我做错了什么?请告诉我。
由于
答案 0 :(得分:0)
您不应将数据库连接传递给视图 - 您的视图应接受包含“实体”数据的对象(作为模型)。视图应该没有自己的逻辑,并且模型的逻辑应该只关注修改内部状态,例如执行验证( not verification )或某些内部数据转换。从数据库填充模型的任务应由控制器或单独的映射类(或模型的某种“填充”方法)完成,但应调用此方法并包含在控制器的操作方法中。 / p>
那就是说,您遇到的问题是因为您正在使用using()
块。 using()
块将始终调用其主题对象的IDisposable.Dispose()
方法,在本例中为数据库连接。 SqlConnection.Dispose
调用其.Close
方法,这就是方法返回时连接对象关闭的原因。