有时候程序处理的数据量比较小时,四平八稳,一切安然无恙,但数据量一大,原先潜伏的问题就暴露无遗了。原访问数据库的代码为:1SqlConnection conn = new SqlConnection(strConn);2conn.Open();3SqlTransaction trans = conn.BeginTransaction();4try5{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}15finally16{17;trans.Dispose();18;conn.Close();19} 202122运行时,一旦出现数据量过大或者处理时间较长,则系统会提示出错。错误提示为“SqlTransaction已经用完;它再也不能使用。”
开始时,我怀疑是跟内存有关。因为系统需要做好事务回滚的准备,每执行一条插入或修改的SQL,都要有一定的开销,数据量一大,恐怕就吃不消了。不过我查了一下SQL SERVER的资料,未见提到内存的问题。后来想到,数据库连接SqlTransaction有个时间问题。默认是15秒。数据量大的时候,这个时间很可能就不够了。于是改为:1SqlConnection conn = new SqlConnection(strConn);2conn.Open();3SqlTransaction trans = conn.BeginTransaction();4try5{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}22finally23{24;trans.Dispose();25;conn.Close();26}修改后在测试,问题解决:)