Как сделать обработку ошибок с использованием операторов в C # - PullRequest
1 голос
/ 02 ноября 2011

я пытаюсь удалить записи из нескольких таблиц базы данных.Для обработки ошибок я использую блок 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
}

Проблема в том, что при возникновении исключения транзакция не откатывается.Читая несколько форумов, я пришел к выводу, что операторы using должны указывать транзакцию и соединение.При удалении незафиксированная транзакция должна быть откатана.

Может кто-нибудь сказать мне, что я делаю не так.

Ответы [ 4 ]

5 голосов
/ 02 ноября 2011

Я предполагаю, что вы не устанавливаете свойство 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 не будет автоматически зачислен в транзакцию, вы должны установить его явно. Насколько я знаю, Dispose() из Transaction должно откатить его назад, но вы можете позвонить Rollback() самостоятельно, так как другие предлагают просто быть уверенным.

1 голос
/ 02 ноября 2011

Для безопасности:

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

Я не смог найти прямой документ, в котором говорится, что транзакция откатывается по умолчанию.

1 голос
/ 02 ноября 2011
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 голосов
/ 02 ноября 2011

Ваш блок try{...} catch{} находится не в том месте.Это должно быть в пределах оператора использования, предпочтительно около transaction.Commit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...