Visual C++ .NET/Database ADO.net/Transaction
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();
}
}