gpt4 book ai didi

c# - 连接自动配置

转载 作者:太空狗 更新时间:2023-10-30 00:02:41 28 4
gpt4 key购买 nike

这可能看起来微不足道,但它确实困扰着我。我今天开始在 MVC 项目中使用 Dapper 并创建了一个非常简单的 POCO 对象;当我运行这个项目时,我收到以下错误消息:

Cannot access a disposed object

Object name: 'OracleConnection'.

代码如下:

public class MyController : Controller
{
readonly IDbConnection sqlConn = new OracleConnection(ConfigurationManager.ConnectionStrings["LogDbContext"].ConnectionString);
readonly string selectLog = "select * from LOG";
readonly string insertLog = "insert into LOG (ID, Address) values (:ID, :Address)";

// GET: Log
public ActionResult Index()
{
using (sqlConn)
{
sqlConn.Open();

//IEnumerable log = sqlConn.Query(selectLog);

IEnumerable<Log> log = sqlConn.Query<Log>(selectLog);

foreach (var item in log)
{
Console.WriteLine(item.ToString());
}

}

return View();
}

public ActionResult Create()
{
using (sqlConn)
{
sqlConn.Open();

var log = new Log()
{
ID = 1,
Address = "test"
};

sqlConn.Execute(insertLog, log);

}

return View();
}
}

似乎将“sqlConn”放入 using 语句使其自动处理,因此当该函数再次运行时它无法在连接上工作。

我该如何防止这种情况发生?我不希望每次需要时都手动打开和关闭连接。


更新

使用下面答案提供的所有帮助(全部正确),我最终使用类的构造函数在每次必须使用类时实例化新连接。

    //removed the wrong static attribute and the instantiation
readonly IDbConnection sqlConn;
readonly string selectLog = "select * from LOG";
readonly string insertLog = "insert into LOG (ID, Address) values (:ID, :Address)";

// Created a constructor to instantiate the connection everytime the controller gets called
public LogController()
{
sqlConn = new OracleConnection(ConfigurationManager.ConnectionStrings["LogDbContext"].ConnectionString);
}

最佳答案

您将 sqlConn 声明为 static readonly,这意味着整个应用程序只有一个实例。将其包装在 using() 中意味着在第一个请求完成后,sqlConn 将被处理掉,后续请求将因 ObjectDisposedException 而失败。

要解决此问题,请按如下方式重写代码:

var connectionString = 
ConfigurationManager.ConnectionStrings["LogDbContext"].ConnectionString;
using(var sqlConn = new OracleConnection(connectionString))
{
// ...
}

现在,至于您不想每次都打开 连接,这是您必须要做的。连接是宝贵的,必须谨慎管理:需要时才打开,不再需要时立即关闭。您始终可以将连接初始化逻辑分解到一个单独的方法中,或者采用企业 (r)(tm) 方式并注入(inject)它。

关于c# - 连接自动配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35601033/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com