SqlConnection在using语句中意外关闭

问题描述 投票:8回答:1

我有一个SQL连接服务,我正在尝试构建。我基本上这样做:

var data = await GetDataFromFlatFilesAsync(dir).ConfigureAwait(false);
using (var conn = new SqlConnection(MyConnectionString))
{
    try
    {
        conn.Open();
        var rw = new SqlReaderWriter(conn);

        await DoStuffWithSqlAsync(rw, data).ConfigureAwait(false);
     }
     catch (Exception ex)
     {
         // Do exceptional stuff here
     }
}

DoStuffWithSqlAsync的运作方式如下:

private async Task DoStuffWithSqlAsync(SqlReaderWriter rw, IEnumerable<Thing> data)
{
    await Task.WhenAll(data.Select(rw.RunQueryAsync)).ConfigureAwait(false);
}

RunQueryAsync的运作方式如下:

public async Task RunQueryAsync<T>(T content)
{
    // _conn is assigned to in the constructor with conn
    try
    {
        var dataQuery = _conn.CreateCommand();
        dataQuery.CommandText = TranslateContentToQuery(content);
        await dataQuery.ExecuteNonQueryAsync().ConfigureAwait(false);
    }
    catch (Exception ex)
    {
        // Do exceptional stuff here
    }
}

我遇到的问题是DoStuffWithSqlAsync连续失败,并且System.InvalidOperationException声称conn处于关闭状态。但是,当我检查堆栈跟踪时,我发现执行仍然在using语句中。我也知道conn在这个操作中的任何地方都没有关闭,因为执行必须返回到语句,并且内部的任何异常都应该冒泡到封闭的try-catch并在那里捕获。此外,还连接了连接并启用了MARS。那么,为什么要关闭呢?

更新:有人指出我没有打开我的连接。我已经这样做但错误仍然存​​在,除了现在_conn.State设置为Open

更新:我遇到了一个问题,其中我使用的await conn.OpenAsync.ConfigureAwait(false);不会阻止执行。因此,当我尝试连接到数据库时,我会得到一个异常,说明连接状态已关闭,但到那时它将打开,因此在检查时它会显示Open。有人建议我调用方法async void但是因为应用程序是控制台,而不是UI我不认为这会有所帮助。我已经恢复使用同步方法。

c# sql parallel-processing
1个回答
8
投票

你只需要打开连接:

try
{
  conn.Open() //<--add this
  var rw = new SqlReaderWriter(conn);
  await DoStuffWithSqlAsync(rw, data).ConfigureAwait(false);
}
© www.soinside.com 2019 - 2024. All rights reserved.