質問: bulkTimeout;//e.g. 120 sec. //... fill with data, map columns... bulkCopy.WriteToServer(table); // ^^^^ waits indefinitely, doesn't throw until *after* // the lock is released. } } ``` 私は、 `using`ブロックの範囲で例外を処理するのではなく、例外をバブルアップすることを好みますが、いつでも再スローすることができます。どんな洞察にも感謝します。 **アップデート1:** まだ解像度はありません。 SqlBulkCopy.WriteToServerメソッドが無期限にハングする同じロック中に、正常なSqlCommandが期待どおりTimeoutExceptionをスローします。 期待どおりにSqlBulkCopy.WriteToServerに一貫してタイムアウトが発生するようにしてみました。 * MARS(複数のアクティブな結果セット)のオン/オフ * TableLock onとoff * ヒープテーブルとインデックステーブルの間のデスティネーション * バルクタイムアウト値の長短(10秒〜5分) * 内部取引と外部取引 現時点では、回避策として、私はa)WriteToServer呼び出しを非同期ラッパーに入れて、自分で時間を計ることができるようにする、b)WriteToServerを1回だけ呼び出す、タイムアウト後、WriteToServerを再度試行*する*前に、通常のSqlCommand *が成功する*まで待ちます。これらのアプローチを使用して、私は少なくとも実行フローを制御することができます。
回答: SqlBulkOptions.TableLockオプションをSqlBulkCopyに渡そうとしましたか?そのオプション(見積もり)は、次のことを意味します: > 一括コピー操作の間、一括更新ロックを取得します。 > > したがって、テーブルをロックする別の処理があると、ロックが得られなくなり、理論的には確実にタイムアウトになることはありません。 **更新:** 私自身のテストハーネスをセットアップし、再現できません。テーブルをロックするために、 `SELECT * FROM TargetTable WITH (HOLDLOCK)`してSSMSでトランザクションを開始しました。私は、内部トランザクションを使用して、30秒のバルクロードタイムアウトを使用して、質問に含まれているのと同じBulkCopyメソッドを使用しました。一括コピーを実行しようとする各試行は、30秒後に予想どおりにタイムアウトします。その後、SSMSトランザクションをロールバックすると成功します。 私はSQL Server 2008 Express、.NET 3.5を使用していました。 最初の試行の後のようなものではなく、バルクロードタイムアウトが正しく渡されていませんか?つまり、何らかの形で「不確定」に設定されていません。 **アップデート2:** また、接続文字列内の複数のアクティブな結果セットのサポートを有効にしましたが、毎回一貫してタイムアウトします。