ODBC API开发教程 - 图文(4)

2019-09-01 12:04

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);申请的句柄。


ODBC API开发教程 - 图文(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:第三章 平面机构的运动分析 习题与答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: