有时候程序处理的数据量比较小时,四平八稳,一切安然无恙,但数据量一大,原先潜伏的问题就暴露无遗了。 原访问数据库的代码为: 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} 修改后在测试,问题解决:)
|