原访问数据库的代码为:
1
SqlConnection conn
=
new SqlConnection(strConn);
2 conn. Open ();
3 SqlTransaction trans = conn.BeginTransaction();
4 try
5 {
6 CEngine.ExecuteNonQuery(trans,CommandType. Text ,sql);
7 trans. Commit ();
8 }
9 catch(SqlException ex)
10 {
11 trans. Rollback ();
12 ErrorCode = ex. Number ;
13 Info = "数据操作失败:" + ex.Message;
14 }
15 finally
16 {
17 trans.Dispose();
18 conn. Close ();
19 }
20
21
22
2 conn. Open ();
3 SqlTransaction trans = conn.BeginTransaction();
4 try
5 {
6 CEngine.ExecuteNonQuery(trans,CommandType. Text ,sql);
7 trans. Commit ();
8 }
9 catch(SqlException ex)
10 {
11 trans. Rollback ();
12 ErrorCode = ex. Number ;
13 Info = "数据操作失败:" + ex.Message;
14 }
15 finally
16 {
17 trans.Dispose();
18 conn. Close ();
19 }
20
21
22
运行时,一旦出现数据量过大或者处理时间较长,则系统会提示 出错。错误提示为“ SqlTransaction 已经用完;它再也不能使用。 ”
开始时,我怀疑是跟内存有关。因为系统需要做好事务回滚的准备,每执行一条插入或修改的SQL,都要有一定的开销,数据量一大,恐怕就吃不消了。不过我查了一下SQL SERVER的资料,未见提到内存的问题。
后来想到,数据库连接SqlTransaction有个时间问题。默认是15秒。数据量大的时候,这个时间很可能就不够了。于是改为:
1
SqlConnection conn
=
new SqlConnection(strConn);
2 conn. Open ();
3 SqlTransaction trans = conn.BeginTransaction();
4 try
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 }
16 catch(SqlException ex)
17 {
18 trans. Rollback ();
19 ErrorCode = ex. Number ;
20 Info = "数据操作失败:" + ex.Message;
21 }
22 finally
23 {
24 trans.Dispose();
25 conn. Close ();
26 }
2 conn. Open ();
3 SqlTransaction trans = conn.BeginTransaction();
4 try
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 }
16 catch(SqlException ex)
17 {
18 trans. Rollback ();
19 ErrorCode = ex. Number ;
20 Info = "数据操作失败:" + ex.Message;
21 }
22 finally
23 {
24 trans.Dispose();
25 conn. Close ();
26 }
修改后在测试,问题解决:)