トランザクション開始
#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;
}
|
|
|