プログラムによって処理されるデータの量が比較的少なく、すべてが安定しており、すべてが安全である場合もありますが、データの量が大量になると、もともと隠れていた問題が露呈します。
データベースにアクセスする元のコードは次のとおりです:
1SqlConnection conn = new SqlConnection(strConn);
2conn.Open();
3SqlTransaction trans = conn.BeginTransaction();
4try
5{
6 CEngine.ExecuteNonQuery(trans, CommandType.Text,sql);
7 trans.Commit();
8}
9catch(SqlException ex)
10{
11 trans.Rollback();
12 ErrorCode = ex.Number;
13 Info = "データ操作失敗しました: " ex.Message;
14}
15finally
16{
17 trans.Dispose();
18 conn.Close();
19}
20
21
22
実行時、データ量が一定になったら大きすぎるか、処理時間が長すぎる場合、システムはエラーを表示します。エラー メッセージは「SqlTransaction が使用されています。もう使用できません。」です。最初はメモリに関連しているのではないかと思いました。システムはトランザクションのロールバックを準備する必要があるため、SQL ステートメントが挿入または変更されるたびに、データ量が大きい場合は一定量のオーバーヘッドが発生します。ただし、SQL SERVER 情報を確認したところ、メモリの問題については言及されていませんでした。
後になって、データベース接続 SqlTransaction にタイミングの問題があるのではないかと思いました。デフォルトは 15 秒です。データ量が多い場合、この時間では十分ではない場合があります。したがって、次のように変更されました:
1SqlConnection conn = new SqlConnection(strConn);
2conn.Open();
3SqlTransaction trans = conn.BeginTransaction();
4try
5{
6 SqlCommand cmd = new SqlCommand();
7 cmd。 CommandType = CommandType.Text;
8 //接続時間制限を 300 秒に変更します
9 cmd.CommandTimeout = 300;
10 cmd.CommandText = sql;
11 cmd.Connection = conn;
12 cmd.Transaction = trans ;
13 cmd.ExecuteNonQuery();
14 trans.Commit();
15}
16catch(SqlException ex)
17{
18 trans.Rollback();
19 ErrorCode = ex.Number;
20 Info = "データ操作が失敗しました: "ex.Message;
21}
22finally
23{
24 trans.Dispose();
25 conn.Close();
26}
変更後、問題は解決されました:)