【问题标题】:The ConnectionString property has not been initialized Error with DapperConnectionString 属性尚未初始化 Dapper 的错误
【发布时间】:2021-06-22 17:22:03
【问题描述】:

我执行 SQL 插入命令的代码是这样的

foreach (var id in idlist)
{
    _connection.Open();
    var sql = "sql query"
    var parameters = ....

    await _connection.ExecuteAsync(sql, parameters);
    _connection.Close();
}

一切看起来不错,但是循环只成功运行一次,当它进入第二次时会抛出错误

The ConnectionString property has not been initialized.

谁能指出我在这里做错了什么?

注意:我也尝试过将连接打开和关闭移出循环,但结果仍然相同。

【问题讨论】:

  • 是否可以在调用“_connection.Open()”之前打印“connectionstring”属性的值并检查其值是如何以及在何处被清除的?
  • 通常,使用 SqlConnection 的方式是创建一个,打开它,使用它,然后关闭或处置它。要么保持打开状态,要么为每个查询创建一个新的(实际上是连接池前面的轻量级外观)
  • 允许 Dapper 处理打开和关闭。在这里,您无需在将连接发送到 Dapper 之前打开连接。如果输入连接未处于打开状态,Dapper 将打开它 - Dapper 将执行操作 - Dapper 将关闭连接。那里有一些隐藏代码导致_connection在没有连接字符串的情况下重新初始化

标签: c# .net ado.net dapper


【解决方案1】:

您的代码应如下所示:

_connection.Open();
var sql = "sql query"

foreach (var id in idlist)
{
    var parameters = ....
    await _connection.ExecuteAsync(sql, parameters);
}
_connection.Close();

如果您只执行一次,请省略打开和关闭(Dapper 会这样做),除非您的连接已注册到事务中

_connection 的命名就像是一个类级别的变量。确保循环运行时您没有在其他地方操作它。我不会说你通过引用一个连接获得了很多,也许考虑一下:

using var connection = new SqlConnection("your conn string");
connection.Open();
var sql = "sql query"

foreach (var id in idlist)
{
    var parameters = ....
    await _connection.ExecuteAsync(sql, parameters);
}
connection.Close();

错误处理将根据您想要执行的操作而有所不同,例如,如果一个插入在批处理中失败 - 全部转储,停止并修复,忽略并继续。

【讨论】:

  • 次要建议:SqlConnectionIDisposable,所以:using var connection = new SqlConnection("your conn string");
猜你喜欢
  • 2013-10-21
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
相关资源
最近更新 更多