日期:2014-05-19  浏览次数:20834 次

如何将事务执行情况写入数据库中??
如下代码中,在try中,每一名sql语句执行成功都会在日记表中插入一行记录,如果有任何一句sql语句失败的话,则所有语句都会回滚,问题是插入的日志也会被回滚掉,怎样才能使日志不被回滚呢?

SqlConnection   conn   =   new   SqlConnection(connectionstring)
conn.Open();
SqlTransaction   tran   =   conn.BeginTransaction();

try
{
      SqlHelper.ExecSql(tran,   sql1);
      WriteNote( "sql1执行成功 ");
      SqlHelper.ExecSql(tran,   sql2);
      WriteNote( "sql2执行成功 ");      
      SqlHelper.ExecSql(tran,   sql3);
      WriteNote( "sql3执行成功 ");      
      SqlHelper.ExecSql(tran,   sql4);
      WriteNote( "sql4执行成功 ");      

      tran.Commit();
}
catch
{
      tran.Rollback();
}

function   void   WriteNote(string   txt)
{
        string   sql   =   "insert   into   Note   (txt)   values   ( "   +   txt   +   ") ";
        ......
}

------解决方案--------------------
把日志写入文件中,就不会了
------解决方案--------------------
SqlConnection conn = new SqlConnection(connectionstring)
conn.Open();
SqlTransaction tran = conn.BeginTransaction();
string[] msg = new { " ", " ", " ", " "};
try
{

SqlHelper.ExecSql(tran, sql1);
msg[0] = "sql1执行成功 ";
SqlHelper.ExecSql(tran, sql2);
msg[1] = "sql2执行成功 ";
SqlHelper.ExecSql(tran, sql3);
msg[2] = "sql3执行成功 ";
SqlHelper.ExecSql(tran, sql4);
msg[4] = "sql4执行成功 ";

tran.Commit();
}
catch
{
tran.Rollback();
}
finally
{
//--这个方法有个问题 不能确保消息插入一定成功.

for(int ix=0; ix <msg.Length; ix++)
{
if(msg[ix] != " ")
{
string sql = "insert into Note (txt) values ( " + msg[ix] + ") ";
SqlHelper.ExecSql(conn, sql);
}
}

conn.Close();
}
------解决方案--------------------
日志 用另外的 连接插入
------解决方案--------------------
使用不同的连接即可,只要写入日志的连接和数据操作的连接不是一个连接,数据操作的连接中的事务即使回滚,也不影响日志使用的连接。
------解决方案--------------------
是的,事务用的连接与日志用的连接不是同一个连接就不会影响。
------解决方案--------------------
最好是用一个文件保存