C# 如何在C中使用语句进行错误处理#
我正在尝试从多个数据库表中删除记录。对于错误处理,我使用了一个try/catch块,如下所示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
{
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中时将始终被调用。除非在提交之后发生异常,否则您描述的内容不应该发生。你确定不是这样吗?