Sql server 为什么我需要手动打开这个.NET核心数据库连接,而Dapper通常会自动打开它?

Sql server 为什么我需要手动打开这个.NET核心数据库连接,而Dapper通常会自动打开它?,sql-server,.net-core,async-await,ado.net,dapper,Sql Server,.net Core,Async Await,Ado.net,Dapper,我正在尝试使用async/await将大量记录插入数据库。如果不手动打开连接,则会出现异常。如果我添加一些代码来打开连接,那么一切正常 以下是当前代码(引发异常): 使用(var连接=新的SqlConnection(ConnectionString)) { var tasks=新列表(); ForEach(url=>tasks.Add(InsertUrlAsync(connection,url)); ForEach(url=>tasks.Add(InsertUrlAsync(connection

我正在尝试使用async/await将大量记录插入数据库。如果不手动打开连接,则会出现
异常
。如果我添加一些代码来打开连接,那么一切正常

以下是当前代码(引发异常):

使用(var连接=新的SqlConnection(ConnectionString))
{
var tasks=新列表();
ForEach(url=>tasks.Add(InsertUrlAsync(connection,url));
ForEach(url=>tasks.Add(InsertUrlAsync(connection,url));
等待任务。何时(任务);
}
...
专用异步任务InsertUrlAsync(IDbConnection连接,字符串url)
{
const string query=“插入..”;
返回wait connection.ExecuteAsync(查询,新{..});
}
例外情况:

消息:System.InvalidOperationException:操作无效。连接已关闭

但是,当我将代码更改为以下内容时,它会起作用:

var tasks = new List<Task>();
await connection.OpenAsync();
soldUrls.ForEach(....) .. etc ... 

var tasks=newlist();
等待连接。OpenAsync();
索杜尔斯弗雷奇(。。等
类似问题:


Dapper为您打开连接;但当工作完成时,它也会关闭它

现在,您正在使用一个连接运行两个独立的
async
任务

这两个任务同时运行。当一个任务的工作完成时,它关闭连接。但另一个任务仍在运行,无法再访问打开的连接,因此出现了您在问题中提到的异常

正如你所说的,如果你自己打开连接,Dapper不会关闭它,一切正常


顺便说一下,当同时使用连接实例时,可能会出现意外问题。有关更多详细信息,请参阅问题。

Dapper为您打开连接;但当工作完成时,它也会关闭它

现在,您正在使用一个连接运行两个独立的
async
任务

这两个任务同时运行。当一个任务的工作完成时,它关闭连接。但另一个任务仍在运行,无法再访问打开的连接,因此出现了您在问题中提到的异常

正如你所说的,如果你自己打开连接,Dapper不会关闭它,一切正常


顺便说一下,当同时使用连接实例时,可能会出现意外问题。有关更多详细信息,请参阅问题。

我被这个问题弄糊涂了,为什么您认为不需要打开连接?这与Dapper有什么关系?它是关于根据@amitjoshi的回复控制打开/关闭连接。使用多个任务插入多行比将多个insert语句批处理在一起或使用SQLBulkCopy要慢。我对这个问题感到困惑,为什么你认为你不需要打开连接?这与Dapper有什么关系?它是关于根据@amitjoshi的回复控制打开/关闭连接。使用多个任务插入多行比将多个insert语句批处理在一起或使用SqlBulkCopyAH要慢!因此,如果您事先打开连接,那么它将无法控制
.open()
/
.Close()
?啊!!完美的干杯:)但您不能同时使用单个SqlConnection。所以这不会(可靠地)起作用。如果希望任务同时运行,则需要单独的连接。@DavidBrowne-Microsoft:Yah;但这并不是问题的核心。无论如何,我已经编辑了答案来提及它。它甚至不是并发的。SqlConnection每次只执行一个命令。啊!因此,如果您事先打开连接,那么它将无法控制
.open()
/
.Close()
?啊!!完美的干杯:)但您不能同时使用单个SqlConnection。所以这不会(可靠地)起作用。如果希望任务同时运行,则需要单独的连接。@DavidBrowne-Microsoft:Yah;但这并不是问题的核心。无论如何,我已经编辑了答案来提及它。它甚至不是并发的。SqlConnection一次只执行一个命令。
var tasks = new List<Task>();
await connection.OpenAsync();
soldUrls.ForEach(....) .. etc ... 

soldUrls.ForEach(url => tasks.Add(InsertUrlAsync(connection, url))); 
rentUrls.ForEach(url => tasks.Add(InsertUrlAsync(connection, url)));