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

C# 如何在C中使用语句进行错误处理#,c#,ado.net,transactions,error-handling,using-statement,C#,Ado.net,Transactions,Error Handling,Using Statement,我正在尝试从多个数据库表中删除记录。对于错误处理,我使用了一个try/catch块,如下所示 try { using (SqlCeConnection oConn = new SqlCeConnection(ConnectionString)) { oConn.Open(); using (SqlCeTransaction transaction = oConn.BeginTransaction()) { /

我正在尝试从多个数据库表中删除记录。对于错误处理,我使用了一个try/catch块,如下所示

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
}
问题是,当引发异常时,事务不会回滚。当阅读多个论坛时,我的结论是“使用”语句应该处理事务和连接。处置时,应回滚未提交的事务

谁能告诉我我做错了什么。

为了安全起见:

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
}
    using (SqlCeTransaction transaction = oConn.BeginTransaction())
    {
        try
        {
          //delete from multiple tables using ADO.NET
          transaction.Commit();
        }
        catch
        {
           transaction.Rollback();
           throw;
        }
    }
我找不到一个直接的文档,说明默认情况下事务被回滚

为了安全起见:

    using (SqlCeTransaction transaction = oConn.BeginTransaction())
    {
        try
        {
          //delete from multiple tables using ADO.NET
          transaction.Commit();
        }
        catch
        {
           transaction.Rollback();
           throw;
        }
    }

我找不到一个直接的文档,说明默认情况下事务被回滚

基本上,您的
try{…}catch{}
块位于错误的位置。它应该在using语句中,最好是在
事务的周围。Commit

基本上,您的
try{…}catch{}
块位于错误的位置。它应该在using语句中,最好是围绕
事务。Commit

我猜您没有设置
SqlCeCommand
transaction
属性(您没有显示)


SqlCeCommand
不会自动登记到事务中,您必须显式设置它。据我所知,
事务的
Dispose()
应该回滚,但您可以按照其他人的建议自己调用
Rollback()
以确保。

我猜您没有设置
SqlCeCommand
事务属性(您没有显示该属性)


SqlCeCommand
不会自动登记到事务中,您必须显式设置它。据我所知,
事务的
Dispose()
应该回滚它,但是您可以调用
Rollback()
请按照其他人的建议来确定自己。

使用
@L.B将您的
try catch
块移动到
的内部,只要异常发生在提交行之前,就不会产生任何影响。从表面上看,代码看起来不错,但这取决于处理代码在SqlCe DLL中是如何实现的。至于它做什么,我只能假设它做了常识性的事情并回滚事务。我不想听起来很愚蠢,但是。。。您如何知道您的事务在从未点击transaction.Commit的情况下仍被提交?您不能使用
oConn
using
之外进行回滚处理SqlTransaction的处理工作与您所想的一样(使用回滚),并且在包装到using.com中时将始终被调用。除非在提交之后发生异常,否则您描述的内容不应该发生。您确定不是这样吗?使用
@L.B将
try catch
块移动到
中,只要异常发生在提交行之前,就不会产生任何影响。从表面上看,代码看起来不错,但这取决于处理代码在SqlCe DLL中是如何实现的。至于它做什么,我只能假设它做了常识性的事情并回滚事务。我不想听起来很愚蠢,但是。。。您如何知道您的事务在从未点击transaction.Commit的情况下仍被提交?您不能使用
oConn
using
之外进行回滚处理SqlTransaction的处理工作与您所想的一样(使用回滚),并且在包装到using.com中时将始终被调用。除非在提交之后发生异常,否则您描述的内容不应该发生。你确定不是这样吗?