我的代码:
this.sqlConn.Open();
SqlTransaction sqlT = this.sqlConn.BeginTransaction();
try {
this.updateCMD = new SqlCommand("update tblBooks set Lended=2 where BookID=@bookID", this.sqlConn);
this.insertCMD = new SqlCommand("insert tblLendLog values(@logID, @libID, @bookID, @startTime)", this.sqlConn);
this.deleteCMD = new SqlCommand("delete from tblPreConcent where LibID=@libID and BookID=@bookID", this.sqlConn);
SqlCommand insertCMD2 = new SqlCommand("insert into tblLog values(@logID, @operation, @opID, @libID, @bookID, @infos)", this.sqlConn); this.updateCMD.Transaction = sqlT;
this.insertCMD.Transaction = sqlT;
this.deleteCMD.Transaction = sqlT;
insertCMD2.Transaction = sqlT; int res = this.updateCMD.ExecuteNonQuery();
res += this.insertCMD.ExecuteNonQuery();
res += this.deleteCMD.ExecuteNonQuery();
res += insertCMD2.ExecuteNonQuery();
if(res < 4) {
sqlT.Rollback();
return "Error";
}
} catch(Exception e) {
if(this.sqlConn.State != System.Data.ConnectionState.Closed)
this.sqlConn.Close();
this.writeErrorLog("operate: LendOut, msg: " + e.Message + "Method: " + e.TargetSite.Name);
sqlT.Rollback();
return e.Message;
} finally {
sqlT.Commit();
if(this.sqlConn.State != System.Data.ConnectionState.Closed)
this.sqlConn.Close();
}
return "OK";为什么这样执行中 只要程序进入catch块或者finally块就会提示“此 SqlTransaction 已完成;它再也无法使用。”?各位大虾给看一下,这样做是哪里错了,,谢谢谢谢啦~~(ps: Sql语句中的参数部分省略了,因为不可能出现问题)
this.sqlConn.Open();
SqlTransaction sqlT = this.sqlConn.BeginTransaction();
try {
this.updateCMD = new SqlCommand("update tblBooks set Lended=2 where BookID=@bookID", this.sqlConn);
this.insertCMD = new SqlCommand("insert tblLendLog values(@logID, @libID, @bookID, @startTime)", this.sqlConn);
this.deleteCMD = new SqlCommand("delete from tblPreConcent where LibID=@libID and BookID=@bookID", this.sqlConn);
SqlCommand insertCMD2 = new SqlCommand("insert into tblLog values(@logID, @operation, @opID, @libID, @bookID, @infos)", this.sqlConn); this.updateCMD.Transaction = sqlT;
this.insertCMD.Transaction = sqlT;
this.deleteCMD.Transaction = sqlT;
insertCMD2.Transaction = sqlT; int res = this.updateCMD.ExecuteNonQuery();
res += this.insertCMD.ExecuteNonQuery();
res += this.deleteCMD.ExecuteNonQuery();
res += insertCMD2.ExecuteNonQuery();
if(res < 4) {
sqlT.Rollback();
return "Error";
}
} catch(Exception e) {
if(this.sqlConn.State != System.Data.ConnectionState.Closed)
this.sqlConn.Close();
this.writeErrorLog("operate: LendOut, msg: " + e.Message + "Method: " + e.TargetSite.Name);
sqlT.Rollback();
return e.Message;
} finally {
sqlT.Commit();
if(this.sqlConn.State != System.Data.ConnectionState.Closed)
this.sqlConn.Close();
}
return "OK";为什么这样执行中 只要程序进入catch块或者finally块就会提示“此 SqlTransaction 已完成;它再也无法使用。”?各位大虾给看一下,这样做是哪里错了,,谢谢谢谢啦~~(ps: Sql语句中的参数部分省略了,因为不可能出现问题)
解决方案 »
- 如何能在mdi上加一个panel并且做成windows桌面的样子 让mdi子窗体在panel和panel中img上?
- sharpdevelop怎样编译单个C#文件
- adventNet .net 版本,解析mib库的时候,中文描述为乱码?
- 如何移动ftp服务器上的文件
- 如何判断一个URL查询字串是采用UF8编码还用使用其它方式的编码
- VSS2005下载地址
- 急问怎么用ADSI控制目录权限,或用其他方法,~~~顶着有分~~~~
- C#导出EXCEL问题
- C#中调用动态链接库,需要使用C/C++中的结构体类型变量作为函数参数,求解决??!!
- 望高手指点。“未将对象引用设置到对象的实例。”
- 急,传参问题
- 为什么总是删掉源数据库里面的行??弄了很久没有正确(在线等!!)
因为finally里面的代码无论如何都要运行,
如果出现异常,你就执行Rollback,
而Rollback之后会运行finally里面的Commit()
肯定不行
首先必须保证在执行过程中只要出现问题就要回滚,但是Commit放在try里的话,catch里的RollBack就不能工作了
谢谢谢谢~~
----不会呀,将sqlT.Commit();放在try模块的"}"之前就OK了
1。if(this.sqlConn.State != System.Data.ConnectionState.Closed)
this.sqlConn.Close();
this.writeErrorLog("operate: LendOut, msg: " + e.Message + "Method: " + e.TargetSite.Name);
sqlT.Rollback();
---------------
不能先将sqlConn关闭了,然后再将sqlT回滚。
2。sqlT.Commit();
---------------
finally部分不能用commit,因为finally里的执行语句是不论有没有发生异常,而都会执行的。
所以commit应该在try部分执行正常的时候才能执行该句的。
3。sqlConn的关闭动作最好统一放在finally里面。因为连接总是要关闭的。修改后的代码如下:
SqlTransaction sqlT = this.sqlConn.BeginTransaction();
try {
this.updateCMD = new SqlCommand("update tblBooks set Lended=2 where BookID=@bookID", this.sqlConn);
this.insertCMD = new SqlCommand("insert tblLendLog values(@logID, @libID, @bookID, @startTime)", this.sqlConn);
this.deleteCMD = new SqlCommand("delete from tblPreConcent where LibID=@libID and BookID=@bookID", this.sqlConn);
SqlCommand insertCMD2 = new SqlCommand("insert into tblLog values(@logID, @operation, @opID, @libID, @bookID, @infos)", this.sqlConn); this.updateCMD.Transaction = sqlT;
this.insertCMD.Transaction = sqlT;
this.deleteCMD.Transaction = sqlT;
insertCMD2.Transaction = sqlT; int res = this.updateCMD.ExecuteNonQuery();
res += this.insertCMD.ExecuteNonQuery();
res += this.deleteCMD.ExecuteNonQuery();
res += insertCMD2.ExecuteNonQuery();
if(res < 4) {
sqlT.Rollback();
return "Error";
}
else
{
sqlT.Commit();
return "OK";
}
} catch(Exception e) {
this.writeErrorLog("operate: LendOut, msg: " + e.Message + "Method: " + e.TargetSite.Name);
sqlT.Rollback();
return e.Message;
} finally {
if(this.sqlConn.State != System.Data.ConnectionState.Closed)
this.sqlConn.Close();
}