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);} |
|
|
|
|
|