ODBC APIによるデータ行の追加(トランザクション処理)


トランザクション開始

#include	"TestSqlConnectOra9i.h"

using namespace std;

//トランザクション開始
int	TransactStart(HENV henv, HDBC hdbc,	//Input
			HSTMT &hstmt)	//Output
{

	printf("--------- TransactStart ---------\n");

	RETCODE	rc;

	//接続属性を設定する
	rc	= SQLSetConnectAttr
		(hdbc, SQL_AUTOCOMMIT, 
		SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER);
	printf("SQLSetConnectAttr --> %d\n", rc);
	if(rc != 0){return -1;}

	//ステートメント・ハンドルを割り振る
	rc	= SQLAllocStmt(hdbc, &hstmt);
	printf("SQLAllocStmt --> %d\n", rc);
	if(rc != 0){return -1;}

	//
	rc	= SQLTransact(henv, hdbc, SQL_COMMIT);
	printf("SQLTransact --> %d\n", rc);
	if(rc != 0){return -1;}

	return 0;
}
				


トランザクション終了

#include	"TestSqlConnectOra9i.h"

using namespace std;

//トランザクション終了
//CompletionType --> SQL_COMMIT or SQL_ROLLBACK
int	TransactEnd(HENV henv, HDBC hdbc, HSTMT hstmt, 
	SQLSMALLINT CompletionType)	//InputOnly
{

	printf("--------- TransactEnd ---------\n");

	RETCODE	rc;

	if(CompletionType == SQL_COMMIT){
		printf("COMMIT\n");
	}else if(CompletionType == SQL_ROLLBACK){
		printf("ROLLBACK\n");
	}else{
		printf("ERROR\n"); return -1;
	}

	//
	rc	= SQLEndTran(SQL_HANDLE_ENV, henv, CompletionType);
	printf("SQLEndTran --> %d\n", rc);
	if(rc != 0){return -1;}

	//ステートメント・ハンドルの解放 
	rc	= SQLFreeStmt(hstmt, SQL_DROP);
	printf("SQLFreeStmt --> %d\n", rc);
	if(rc != 0){return -1;}

	return 0;
}
				


SQLコマンド処理

#include	"TestSqlConnectOra9i.h"

using namespace std;

//エラーメッセージ
RETCODE	GetSqlError
	(HENV henv, HDBC hdbc, HSTMT hstmt, RETCODE rc,	//Input
	SQLCHAR szSqlState[6], SQLCHAR szErrorMsg[256]);//Output

//SQLコマンド処理
RETCODE	SendSqlCmdWithoutTransact
	(HENV henv, HDBC hdbc, HSTMT hstmt, 
	char SqlCmdBuff[])		//InputOnly
{
	printf("--- SendSqlCmd ---\n");

	RETCODE	rc;
	SQLCHAR	szSqlState[6];
	SQLCHAR	szErrorMsg[256];

	//printf("%s\n", SqlCmdBuff);
	//
	rc	= SQLExecDirect(hstmt,
			(unsigned char *)SqlCmdBuff,
			SQL_NTS);
	printf("SQLExecDirect --> %d\n", rc);

	//エラーメッセージ
	GetSqlError(henv, hdbc, hstmt, rc,
			szSqlState, szErrorMsg);

	if(rc != 0){return -1;}
	
	return rc;
}
				


test関数

#include	"TestSqlConnectOra9i.h"

using namespace std;

//トランザクション開始
int	TransactStart(HENV henv, HDBC hdbc,	//Input
		HSTMT &hstmt);		//Output

//トランザクション終了
//CompletionType --> SQL_COMMIT or SQL_ROLLBACK
int	TransactEnd(HENV henv, HDBC hdbc, HSTMT hstmt, 
		SQLSMALLINT CompletionType);	//InputOnly

//SQLコマンド処理(トランザクション処理ナシ)
RETCODE	SendSqlCmdWithoutTransact(HENV henv, HDBC hdbc, 
		HSTMT hstmt, char SqlCmdBuff[]);	//InputOnly


//
int	TestTransact(HENV henv, HDBC hdbc, char *SqlCmdBuff)
{

	int	ret;

	HSTMT	hstmt;

	//トランザクション開始
	//2つのテーブルにINSERT文を発行するので、
	//2つ目のテーブルの処理が成功したらCOMMITする。
	ret = TransactStart(henv, hdbc, hstmt);
	if(ret != 0){printf("TransactStart\n"); return -1;}

	//SQLコマンド処理(トランザクション処理アリ)
	ret = SendSqlCmdWithoutTransact
		(henv, hdbc, hstmt, SqlCmdBuff);	//Input

	//トランザクション終了	
	//CompletionType --> SQL_COMMIT or SQL_ROLLBACK
	if(ret == 0){
		ret = TransactEnd(henv, hdbc, hstmt, SQL_COMMIT);
		if(ret != 0){printf("TransactEnd\n");}
	}else{
		cout << "error SendSql" << endl;
		ret = TransactEnd(henv, hdbc, hstmt, SQL_ROLLBACK);
		if(ret != 0){printf("TransactEnd\n");}	
	}
	
	return 0;

}
				


main関数

#include	"TestSqlConnectOra9i.h"

using namespace std;

//	データベースを開く
int	OpenDatabase(HENV *henv, HDBC *hdbc, char connect_str[]);

//	データベースを閉じる
int	CloseDatabase(HENV *henv, HDBC *hdbc);

//エラーメッセージ
RETCODE	GetSqlError(HENV henv, HDBC hdbc, HSTMT hstmt, RETCODE rc,	//Input
		SQLCHAR szSqlState[6], SQLCHAR szErrorMsg[256]);	//Output

int	TestTransact(HENV henv, HDBC hdbc, char *SqlCmdBuff);

void main()
{
	RETCODE		ret;

	HENV	henv;	//環境ハンドル
	HDBC	hdbc;	//接続ハンドル
	
	char	connect_str[SQL_CONDITION_MAX];

	sprintf(connect_str, "DSN=HOST;UID=USER;PWD=PASS");

	//	データベースを開く
	ret = OpenDatabase(&henv, &hdbc, connect_str);
	if(ret == 0){
		cout << "SUCCESS OPEN\n";
	}else{
		cout << "ERROR OPEN\n"; return;
	}


	char	SqlCmdBuff[SQL_BUFF_MAX];

	sprintf(SqlCmdBuff, "%s",
		"INSERT INTO test050118 (KEY00, A1, A2)" 
		"VALUES(1, 'test1', SYSDATE)");
	ret = TestTransact(henv, hdbc, SqlCmdBuff);



	//	データベースを閉じる
	ret = CloseDatabase(&henv, &hdbc);
	if (ret == 0){
		cout << "SUCCESS CLOSE\n";
	}else{
		cout << "ERROR CLOSE\n"; return;
	}

	return;	
}
				



<戻る>

楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル