ODBC APIによるOracle9iのエラーメッセージ取得


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
{

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

	RETCODE	rc_error = SQL_SUCCESS;

	SQLINTEGER	pfNativeError;
	SQLSMALLINT	pcbErrorMsg;

	if(rc == SQL_SUCCESS){		printf("SUCCESS\n");	return rc_error;
	}else if(rc == SQL_ERROR){		printf("SQL_ERROR\n");
	}else if(rc == SQL_INVALID_HANDLE){	printf("INVALID_HANDLE\n");
	}else if(rc == SQL_NO_DATA_FOUND){	printf("NO_DATA_FOUND\n");
	}else{printf("ERROR\n");	return rc_error;
	}

	rc_error = SQLError(henv, hdbc, hstmt, 
		szSqlState, &pfNativeError, szErrorMsg, 
		SQL_MAX_MESSAGE_LENGTH + 1, &pcbErrorMsg);
	cout << "rc_error --> " << rc_error << endl;
	if(rc_error != SQL_SUCCESS){return rc_error;}

	cout << szSqlState << endl;
	cout << szErrorMsg << endl;

	return rc_error;
}
				


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	SendSqlCmd(HENV henv, HDBC hdbc)	//InputOnly
{
	printf("--- SendSqlCmd ---\n");

	HSTMT	hstmt;	//ステートメント・ハンドル
	char	SqlCmdBuff[SQL_BUFF_MAX];

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

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

	sprintf(SqlCmdBuff, 
		"%s", 
		"INSERT INTO test050118 (KEY00, A1, A2)" 
		"VALUES(3, 'test1', SYSDATE)");
	
	//
	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;}
	
	//ステートメント・ハンドルの解放 
	rc	= SQLFreeStmt(hstmt, SQL_DROP);
	printf("SQLFreeStmt --> %d\n", rc);
	if(rc != 0){return -1;}

	return rc;
}
				


main関数

#include	"TestSqlConnectOra9i.h"

using namespace std;


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

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

//SQLコマンド処理
RETCODE		SendSqlCmd(HENV henv, HDBC hdbc);	//InputOnly

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


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;
	}

	//SQLコマンド処理
	ret = SendSqlCmd(henv, hdbc);	//InputOnly
	if(ret == 0){
		cout << "SUCCESS COMMAND\n";
	}else{
		cout << "ERROR COMMAND\n";
	}

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

	return;	
}
				


結果

--- OpenDataBase ---
SQL_MAX_OPTION_STRING_LENGTH = 256
SQLAllocEnv --> 0
SQLAllocConnect --> 0
SQLDriverConnect --> 0
SUCCESS OPEN
--- SendSqlCmd ---
SQLAllocStmt --> 0
SQLExecDirect --> -1
--- GetSqlError ---
SQL_ERROR
rc_error --> 0
23000
[Oracle][ODBC Oracle Driver][Oracle OCI]ORA-00001: 一意制約(DWMS_DEVE.SYS_C003379)に反しています.
ERROR COMMAND
--- CloseDataBase ---
SQLDisconnect --> 0
SQLFreeConnect --> 0
SQLFreeEnv --> 0
SUCCESS CLOSE
				


<戻る>

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル