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

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

Transactions

 
#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();
    }
}


Using Transactions

 
#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();
    }
}