2013-04-30 3 views
0

У меня есть базовая dll, которая содержит общие методы базы данных, такие как getconnectionstring, exectescalar, executononquery, doselect и т. Д. Я работаю с (vb.net или C#) и оракулом. Теперь мне нужно написать метод для транзакции, где я могу иметь 2-3 sqls и должен зафиксировать, только если все они работают. Я пытаюсь понять, как это сделать. Мне нужно sql1, чтобы вернуть какое-то уникальное поле, которое будет использоваться для вставки в sql2 и/или sql3.Методы доступа к данным Sql oracle

private sub executeTransaction(byval sql1 as string,byval sql2 as string,byval sql3 as string) 

     code to begin transaction 
     execute sql1 returning unique id to a local field 'since this id may be different based on sql, how to handle this? 
     execute sql2 
     execute sql3 optional 
     if exception rollback 
     commit on finally block and then close the connection object 

    end sub 

Я ищу предложения/рекомендации по написанию вышеуказанного метода. Заранее спасибо.

ответ

1

Узор:

  • Создание транзакции подключения
  • Назначают эту транзакцию к каждой команде
  • фиксации/отката, когда сделано


using(OracleConnection conn = new OracleConnection()) 
{ 
    using(DbTransaction transaction = conn.BeginTransaction()) 
    { 
     try 
     { 
      // .... create a command 
      cmd1 = new OracleCommand({sql to get a value}); 
      cmd1.Transaction = transaction; 
      cmd1.ExecuteScalar(); 

      // .... create another command 
      cmd1 = new OracleCommand({sql to update a value}); 
      cmd2.Transaction = transaction; 
      cmd2.ExecuteNonQuery(); 

      transaction.Commit(); 
     } 
     catch (Exception err) 
     { 
      transaction.Rollback(); 
      throw err; // or just throw; to preserve the deeper stack trace 
     } 
    } 
} 
+0

Благодарю вас. Это будет wo гк. Один быстрый вопрос, как я могу заставить executescalar вернуть идентификатор последней вставленной строки? Я думал об использовании executeonquery с предложением о возврате. – cableload

+0

Все 'ExecuteScalar' does возвращает значение первого столбца первой строки результата, поэтому вам нужно будет сделать' SELECT' в конце вашей партии. «ExecuteNonQuery» с параметром возврата может быть более чистым. –

Смежные вопросы