1

asp.net Enterprise Libraryを使用して、SQLデータベースにデータを挿入および更新します。

c#コード:

Database db = DatabaseFactory.CreateDatabase();
IDbConnection connection = db.GetConnection();
connection.Open();
IDbTransaction transaction = connection.BeginTransaction();
DBCommandWrapper command;

try
{
//insert part
command = db.GetStoredProcCommandWrapper("stored_procedure1");
command.CommandTimeout = 900;
command.AddInParameter("@parameter1", DbType.Int32, 3);
db.ExecuteNonQuery(command, transaction);

//update part
command = db.GetStoredProcCommandWrapper("stored_procedure2");
command.CommandTimeout = 900;
command.AddInParameter("@param1", DbType.Int32, 5);
db.ExecuteNonQuery(command, transaction);

transaction.Commit();
}
catch (SqlException e)
{
  transaction.Rollback();
  throw (new ApplicationException("sql error", e));
}
catch (Exception e)
{
  transaction.Rollback();
  throw (new ApplicationException("error", e));
}
finally
{
connection.Close();
}

コードはメソッド上にあります。このメソッドは何度も実行され、「タイムアウトが期限切れになりました。プールから接続を取得する前にタイムアウト期間が経過しました。これは、プールされたすべての接続が使用中で、最大プールサイズに達したために発生した可能性があります。」というエラーが発生することがあります。

私の質問は次のとおりです。上記のように挿入部分と更新部分を一緒に使用しても大丈夫ですか?

挿入部分と更新部分を一緒にすると、このエラーが発生しますか?

ありがとう。

4

1 に答える 1

3

まず、エラー時にトランザクションをロールバックしません。

次に、finallyブロックが呼び出されることを保証するには、catchブロックを追加する必要があります。

Try {
...
}
Catch {
}
finally {
close connection
}

以下にあるリンクの2番目の段落を読んでください

http://msdn.microsoft.com/en-us/library/zwc8s4fz(v=vs.100).aspx

于 2013-02-21T01:41:03.823 に答える