回答

收藏

SqlConnection在using句子意外关闭

技术问答 技术问答 177 人阅读 | 0 人回复 | 2023-09-13

我有一个要建立的SQL连接服务。我基本上是这样做的:3 T7 i; w( O/ g8 m- R0 l4 n1 F( c9 e
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 操作如下:
/ [( |. Y; t" G! R! K! n/ nprivate async Task DoStuffWithSqlAsync(SqlReaderWriter rw,IEnumerable data){    await Task.WhenAll(data.Select(rw.RunQueryAsync)).ConfigureAwait(false);}并RunQueryAsync这样运行:$ B2 Y* C; Q$ [4 @
public async Task RunQueryAsync(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-
8 ~& |5 B3 X# o4 k. xcatch并在那里捕获。此外,连接被池化并启用MARS。那为什么要关掉呢?
' f0 K0 W/ T1 j更新:    有人指出我还没有打开我的连接。我已经这样做了,但除了现在_conn.State除了设置,错误仍然存在Open。
, P, B# {' \% D2 L+ G1 Y" g# g更新:    我遇到了一个问题,我使用它awaitconn.OpenAsync.ConfigureAwait(false);这个问题不会被阻止。因此,当我试图连接到数据库时,我会得到一个异常,指出连接状态已经关闭,但它已经打开,所以在检查时显示打开。有人建议使用调用方法异步无效,但由于应用程序是控制台,而不是控制台UI,所以我认为这不会有帮助。之后,我恢复了同步方法。7 n6 b; F* f) ?+ @1 j
                                                                ( k1 r* v* C. v! _( U6 b
    解决方案:                                                                4 [5 i. I3 K' w9 F- h( L4 d# D* w
                                                                您只需打开连接:
8 l- ]: c- \9 dtry{  conn.Open() //<--add this  var rw = new SqlReaderWriter(conn);  await DoStuffWithSqlAsync(rw,data).ConfigureAwait(false);}
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则