SQLCHAR * Sqlstate,
SQLINTEGER * NativeErrorPtr, SQLCHAR * MessageText, SQLSMALLINT BufferLength, SQLSMALLINT * TextLengthPtr);
RecNumber:指明需要得到的错误状态行,从1开始逐次增大。
Sqlstate,NativeErrorPtr,MessageText:返回错误状态,错误代码和错误描述。 BufferLength:指定MessageText的最大长度。
TextLengthPtr:指定返回的MessageText中有效的字符数。
函数的返回值可能为:SQL_SUCCESS,SQL_SUCCESS_WITH_INFO,SQL_ERROR,
SQL_INVALID_HANDLE,SQL_NO_DATA。在没有返回错误的情况下你需要反复调用此函数,并顺次增大RecNumber参数的值,直到函数返回SQL_NO_DATA,以得到所有的错误描述。 示例,得到STMT句柄上的错误信息:
SQLCHAR SqlState[6],SQLStmt[100],Msg[SQL_MAX_MESSAGE_LENGTH]; SQLINTEGER NativeError; SQLSMALLINT i, MsgLen; int i = 1;
while ((rc2 = SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, i, SqlState, &NativeError, Msg, sizeof(Msg), &MsgLen)) != SQL_NO_DATA) {
//显示错误的代码 i++; }
下面的函数来自MS文档,用于显示一个错误的详细情况,你可以在你的程序中直接使用: void ProcessLogMessages(
SQLSMALLINT plm_handle_type,
//出现错误时所使用的ODBC句柄类型,取值为:SQL_HANDLE_ENV ,SQL_HANDLE_DBC ,SQL_HANDLE_STMT
SQLHANDLE plm_handle, //出现错误时所使用的ODBC句柄 char *logstring, //标题字符串 int ConnInd //指明句柄是否为DBC句柄 ) {
RETCODE plm_retcode = SQL_SUCCESS; UCHAR plm_szSqlState[MAXBUFLEN] = \ plm_szErrorMsg[MAXBUFLEN] = \ SDWORD plm_pfNativeError = 0L; SWORD plm_pcbErrorMsg = 0; SQLSMALLINT plm_cRecNmbr = 1;
SDWORD plm_SS_MsgState = 0, plm_SS_Severity = 0; SQLINTEGER plm_Rownumber = 0; USHORT plm_SS_Line;
SQLSMALLINT plm_cbSS_Procname, plm_cbSS_Srvname;
SQLCHAR plm_SS_Procname[MAXNAME], plm_SS_Srvname[MAXNAME];
printf(logstring);
while (plm_retcode != SQL_NO_DATA_FOUND) {
plm_retcode = SQLGetDiagRec(plm_handle_type, plm_handle,
plm_cRecNmbr, plm_szSqlState, &plm_pfNativeError, plm_szErrorMsg, MAXBUFLEN - 1, &plm_pcbErrorMsg);
// Note that if the application has not yet made a // successful connection, the SQLGetDiagField // information has not yet been cached by ODBC // Driver Manager and these calls to SQLGetDiagField // will fail.
if (plm_retcode != SQL_NO_DATA_FOUND) { if (ConnInd) {
plm_retcode = SQLGetDiagField(
plm_handle_type, plm_handle, plm_cRecNmbr, SQL_DIAG_ROW_NUMBER, &plm_Rownumber, SQL_IS_INTEGER, NULL);
plm_retcode = SQLGetDiagField(
plm_handle_type, plm_handle, plm_cRecNmbr, SQL_DIAG_SS_LINE, &plm_SS_Line, SQL_IS_INTEGER, NULL);
plm_retcode = SQLGetDiagField(
plm_handle_type, plm_handle, plm_cRecNmbr, SQL_DIAG_SS_MSGSTATE, &plm_SS_MsgState,
SQL_IS_INTEGER, NULL);
plm_retcode = SQLGetDiagField(
plm_handle_type, plm_handle, plm_cRecNmbr, SQL_DIAG_SS_SEVERITY, &plm_SS_Severity, SQL_IS_INTEGER, NULL);
plm_retcode = SQLGetDiagField(
plm_handle_type, plm_handle, plm_cRecNmbr, SQL_DIAG_SS_PROCNAME, &plm_SS_Procname, sizeof(plm_SS_Procname), &plm_cbSS_Procname); plm_retcode = SQLGetDiagField(
plm_handle_type, plm_handle, plm_cRecNmbr, SQL_DIAG_SS_SRVNAME, &plm_SS_Srvname, sizeof(plm_SS_Srvname), &plm_cbSS_Srvname); }
printf(\ printf(\ printf(\ printf(\ if (ConnInd) {
printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ } }
plm_cRecNmbr++; //Increment to next diagnostic record. } // End while. }
2.4.1.3 SQLConnect 连接数据库
SQLRETURN SQLConnect(
SQLHDBC ConnectionHandle, SQLCHAR * ServerName, SQLSMALLINT NameLength1, SQLCHAR * UserName, SQLSMALLINT NameLength2, SQLCHAR * Authentication, SQLSMALLINT NameLength3);
ConnectionHanlde:为DBC句柄,也就是前面提到到利用: SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hDBC);申请的句柄。