使用语句中的SqlConnection突然关闭

9

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

3
虽然您正在使用“using”语句,但仍需打开连接。请参阅此文章(“Open方法调用”):https://www.dotnetperls.com/sqlconnection。 - diiN__________
可能会有帮助 https://stackoverflow.com/questions/16583792/dbconnection-open-works-but-dbconnection-openasync-doesnt - Daniel B
1个回答

9

您只需要打开连接:

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

没错,问题解决了。我在代码里加了await OpenAsync();这一行,但是上次重构的时候它不见了 >_<非常感谢! - Woody1193

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接