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
無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!