⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myclient.cpp

📁 Chapter08-Transactions.rar com example
💻 CPP
字号:
// MyClient.cpp : Defines the entry point for the application.
//

#include "stdafx.h"

ADOConnectionPtr OpenAccountsDB(ITransaction* pTransaction)
{
	ADOConnectionPtr spConn;
	HRESULT hr = spConn.CreateInstance(__uuidof(ADODB::Connection));
	CHECKHR(hr);

	_bstr_t bsDSN = "provider=sqloledb;database=AccountsDB";
	_bstr_t bsUser = "sa";
	hr = spConn->Open (bsDSN, bsUser, (LPCTSTR) NULL, NULL);
	CHECKHR(hr);

	if (NULL == pTransaction) {
		return spConn;
	}

	ADODB::ADOConnectionConstructionPtr spConnConst = spConn;

	IUnknownPtr spUnk = spConnConst->Session;
	CComPtr<ITransactionJoin> spTranJoin;
	hr = spUnk->QueryInterface(__uuidof(ITransactionJoin), (void**) &spTranJoin);
	CHECKHR(hr);
	hr = spTranJoin->JoinTransaction(pTransaction,
		ISOLATIONLEVEL_ISOLATED, 0, NULL);
	CHECKHR(hr);

	return spConn;
}

void ReduceBalance(ADOConnectionPtr spConn, BSTR bsClient, long lDiff)
{
	TCHAR buf[256];
	_stprintf(buf, _T("UPDATE Accounts SET Balance = Balance - %ld WHERE [client] = '%S'"), 
		lDiff, (LPCWSTR) bsClient);

	_variant_t vRecordCount;
	spConn->Execute(buf, &vRecordCount,-1);
}

void sub();

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	CCPLComInitializer init;
	try {
		sub();
	}catch(_com_error& e) {
		::MessageBox(NULL, CPLGetError(e), NULL, MB_OK);
	}

	return 0;
}

void sub()
{
	CComPtr<ITransactionDispenser> spTxDisp;
	HRESULT hr = ::DtcGetTransactionManager(
		NULL,							// host name
		NULL,							// TM name
		__uuidof(ITransactionDispenser),// interface
		0,								// reserved
		0,								// reserved
		0,								// reserved
		(void**) &spTxDisp);			// [out] pointer
	CHECKHR(hr);

	CComPtr<ITransaction> spTx;
	hr = spTxDisp->BeginTransaction(
		NULL,							// outer component
		ISOLATIONLEVEL_ISOLATED,		// Isolation level
		ISOFLAG_RETAIN_DONTCARE,		// Isolation flag
		NULL,							// Options
		&spTx);							// [out] pointer
	if (FAILED(hr)) {
		_com_issue_errorex(hr, spTxDisp, 
			__uuidof(ITransactionDispenser));
	}

	// ADOConnectionPtr spConn = OpenAccountsDB(NULL);
	ADOConnectionPtr spConn = OpenAccountsDB(spTx);
	ReduceBalance(spConn, _bstr_t("Don"),10);
	// spTx->Abort(NULL, 0, FALSE);
	hr = spTx->Commit(0, XACTTC_SYNC_PHASEONE, 0);
	if (FAILED(hr)) {
		_com_issue_errorex(hr, spTx, 
			__uuidof(ITransaction));
	}

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -