Visual C++ .NET/Database ADO.net/Transaction

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Transactions

<source lang="csharp">

  1. include "stdafx.h"

using namespace System; using namespace System::Data; using namespace System::Data::SqlClient; using namespace System::Configuration; void main(){

   String ^Name = "Doors";
   SqlConnection  ^connection = gcnew SqlConnection();
   SqlTransaction ^transaction;
   connection->ConnectionString = "SQLConnection";
   try{
      connection->Open();
      SqlCommand ^cmd = gcnew SqlCommand();
      transaction = connection->BeginTransaction(IsolationLevel::Serializable, "AuthorTransaction");
      cmd->Connection  = connection;
      cmd->Transaction = transaction;
      cmd->CommandType = CommandType::StoredProcedure;
      cmd->CommandText = "InsertAuthor";
      cmd->Parameters->Add(gcnew SqlParameter("@LastName", SqlDbType::Char,32));
      cmd->Parameters->Add(gcnew SqlParameter("@FirstName",SqlDbType::Char,32));
      cmd->Parameters["@LastName"]->Value  = "Dope";
      cmd->Parameters["@FirstName"]->Value = "John";
      int affected = cmd->ExecuteNonQuery();
      if (affected <= 0)
          throw gcnew Exception("Insert Failed");
      Console::WriteLine("Insert - {0} rows are affected", affected);
      cmd->CommandType = CommandType::Text;
      cmd->CommandText = "UPDATE Authors SET LastName = "Doe" WHERE LastName = "Dope"";
      affected = cmd->ExecuteNonQuery();
      if (affected <= 0)
          throw gcnew Exception("Insert Failed");
      Console::WriteLine("Update - {0} rows are affected", affected);
      cmd->CommandType = CommandType::Text;
      cmd->CommandText = "DELETE FROM Authors WHERE LastName = "Does"";
      affected = cmd->ExecuteNonQuery();
      if (affected <= 0)
          throw gcnew Exception("Insert Failed");
      Console::WriteLine("Delete - {0} rows are affected", affected);
      transaction->Commit();
   }
   catch (Exception ^e)
   {
       transaction->Rollback("AuthorTransaction");
       Console::WriteLine("Transaction Not completed");
       Console::WriteLine("SQL error occurred: {0}", e->Message);
   }
   finally
   {
       connection->Close();
   }

}

 </source>


Using Transactions

<source lang="csharp">

  1. include "stdafx.h"

using namespace System; using namespace System::Data; using namespace System::Data::OleDb; ref struct MyEventHandler {

   static void RowUpdated(Object^ sender, OleDbRowUpdatedEventArgs^ e)
   {
       if ( e->Status == UpdateStatus::ErrorsOccurred )
           throw "Row update failed!";
   }

}; void main() {

   OleDbConnection^ myConnection = nullptr;
   OleDbTransaction^ myTransaction = nullptr;
   
   try
   {
       myConnection = gcnew OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Music.mdb");
       myConnection->Open();
       
       OleDbDataAdapter^ dataAdapter = gcnew OleDbDataAdapter("SELECT * FROM Music", myConnection);
       OleDbCommandBuilder^ commandBuilder = gcnew OleDbCommandBuilder(dataAdapter);
       dataAdapter->UpdateCommand = commandBuilder->GetUpdateCommand();
       
       dataAdapter->RowUpdated += gcnew OleDbRowUpdatedEventHandler(MyEventHandler::RowUpdated);
       
       DataSet^ myDataSet = gcnew DataSet();
       dataAdapter->MissingSchemaAction = MissingSchemaAction::AddWithKey;
       dataAdapter->Fill(myDataSet);
       
       myTransaction = myConnection->BeginTransaction();
       
       DataTable^ myTable = myDataSet->Tables[0];
       
       DataRow^ row = myTable->Rows->Find("Automatic");
       if ( row != nullptr )
           row["Title"] = "Automatic (Dance Mix)";
       row = myTable->Rows->Find("EnTrance");        
       if ( row != nullptr )
           row["GenreName"] = "Trance";
       
       dataAdapter->Update(myDataSet);
       myTransaction->Commit();
   }
   catch(Exception^ e)
   {
       Console::WriteLine(e->Message);
       if ( myTransaction != nullptr )
       {
           myTransaction->Rollback();
           Console::WriteLine("Transaction rolled back.");
       }
   }
   finally
   {
       myConnection->Close();
   }

}

 </source>