【问题标题】:SqlConnection closes unexpectedly inside using statementSqlConnection 在 using 语句中意外关闭
【发布时间】:2018-01-05 00:45:17
【问题描述】:

我正在尝试构建一个 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);,它不会阻止执行。因此,当我尝试连接到数据库时,我会收到一个异常,指出连接状态已关闭,但到那时它会打开,因此检查时会显示打开。有人建议我将调用方法设置为 async void,但由于应用程序是控制台,而不是 UI,我认为这不会有帮助。此后我又恢复使用同步方法。

【问题讨论】:

标签: c# sql parallel-processing


【解决方案1】:

你只需要打开连接:

try
{
  conn.Open() //<--add this
  var rw = new SqlReaderWriter(conn);
  await DoStuffWithSqlAsync(rw, data).ConfigureAwait(false);
}

【讨论】:

  • 是的,解决了它。我在那里有 await OpenAsync(); 行,当我上次重构时它丢失了 >_
猜你喜欢
  • 2011-03-05
  • 1970-01-01
  • 2014-05-28
  • 2016-03-15
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
相关资源
最近更新 更多