1

我使用 asp.net 企业库将数据插入和更新到 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
}

阅读下面链接的第二段

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

于 2013-02-21T01:41:03.823 回答