我有一个正在尝试构建的 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,我认为这不会有所帮助。我已经恢复使用同步方法。