エラーメッセージ取得
#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
|
|
|