如何在C#中使用语句进行错误处理

问题描述:

即时尝试从多个数据库表中删除记录。对于错误处理,我使用了一个try/catch块,如下所示。如何在C#中使用语句进行错误处理

try 
{ 
    using (SqlCeConnection oConn = new SqlCeConnection(ConnectionString)) 
    { 
     oConn.Open(); 
     using (SqlCeTransaction transaction = oConn.BeginTransaction()) 
     { 
      //delete from multiple tables using ADO.NET 
      transaction.Commit(); 
     } 
    } 
} 
catch 
{ 
    //error handling 
} 

问题是当引发异常事务没有回滚。在阅读多个论坛时,我的结论是'使用'语句应该处理事务和连接。处置时,未提交的事务应该回滚。

有人可以告诉我我做错了什么。

+0

将'try-catch'块移到''using'内使用' –

+0

@ L.B只要异常发生在提交行之前,这应该没什么区别。在表面上,代码看起来很好,但它取决于SqlCe DLLs中的处理代码是如何实现的,我只能假定它执行常识并回滚事务。 –

+0

我讨厌听起来很愚蠢,但是......你怎么知道你的交易正在承诺,尽管从来没有碰到交易。提交? – sq33G

我的猜测是,你不是要设置的Transaction财产您SqlCeCommand(你不显示)。

try 
{ 
    using (SqlCeConnection oConn = new SqlCeConnection(ConnectionString)) 
    { 
     oConn.Open(); 
     using (SqlCeCommand command = oConn.CreateCommand()) 
     { 
      using (SqlCeTransaction transaction = oConn.BeginTransaction()) 
      { 
       command.Transaction = transaction; 
       //delete from multiple tables using ADO.NET using command 
       transaction.Commit(); 
      } 
     } 

    } 
} 
catch 
{ 
    //error handling 
} 

SqlCeCommand不会自动登记在交易中,你必须明确地设置它。据我所知,TransactionDispose()应该回滚,但您可以自己拨打Rollback(),因为其他人建议您确定一下。

try 
{ 
    using (SqlCeConnection oConn = new SqlCeConnection(ConnectionString)) 
    { 
    oConn.Open(); 

    using (SqlCeTransaction transaction = oConn.BeginTransaction()) 
    { 
     try 
     { 
      //delete from multiple tables using ADO.NET 
      transaction.Commit(); 
     } 
     catch 
     { 
      transaction.Rollback(); 
      throw; 
     } 
    } 
    } 
} 
catch (Exception e) 
{ 
    // do Exception handling here 
}
+0

+1 - 击败我吧 – ChrisBD

保证其安全可靠:

​​

我找不到一个直接的一块,指出一个事务回滚默认文档。

+0

+1 - 击败我吧 – ChrisBD

基本上你的try{...} catch{}块是在错误的地方。它应该是using语句中,优选地围绕transaction.Commit

+0

这不是在错误的地方。需要一个_extra_ try/catch。 –