如何在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
}
问题是当引发异常事务没有回滚。在阅读多个论坛时,我的结论是'使用'语句应该处理事务和连接。处置时,未提交的事务应该回滚。
有人可以告诉我我做错了什么。
我的猜测是,你不是要设置的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
不会自动登记在交易中,你必须明确地设置它。据我所知,Transaction
的Dispose()
应该回滚,但您可以自己拨打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
}
+1 - 击败我吧 – ChrisBD
基本上你的try{...} catch{}
块是在错误的地方。它应该是using语句中,优选地围绕transaction.Commit
这不是在错误的地方。需要一个_extra_ try/catch。 –
将'try-catch'块移到''using'内使用' –
@ L.B只要异常发生在提交行之前,这应该没什么区别。在表面上,代码看起来很好,但它取决于SqlCe DLLs中的处理代码是如何实现的,我只能假定它执行常识并回滚事务。 –
我讨厌听起来很愚蠢,但是......你怎么知道你的交易正在承诺,尽管从来没有碰到交易。提交? – sq33G