2017-08-01 75 views
0

我在SLES 12機器上安裝了unixODBC-2.3.1-4.95.x86_64並編寫了一些應用程序。但是我遇到了使用unixODBC的PosgreSQL中的錯誤處理問題。檢索PostgreSQL本機錯誤代碼

要做到這一點,我創建了以下功能:

void checkDiag (SQLSMALLINT handleType, SQLHANDLE handle) 

{ 

     SQLRETURN rc = SQL_ERROR; 
     SQLCHAR sqlState[6]; 
     SQLINTEGER nError; 
     SQLSMALLINT recnum = 0; 
     SQLCHAR eMsg[SQL_MAX_MESSAGE_LENGTH]; 
     SQLCHAR nativeError[SQL_MAX_MESSAGE_LENGTH]; 
     while (rc != SQL_NO_DATA_FOUND) 
     { 
       rc = SQLGetDiagRec (handleType, 
            handle, 
            recnum, 
            sqlState, 
            &nError, 
            eMsg, 
            255, 
            NULL); 
       if (rc != SQL_NO_DATA_FOUND) 
       { 
         SQLGetDiagField(handleType, 
             handle, 
             recnum, 
             SQL_DIAG_NATIVE, 
             nativeError, 
             255, 
             NULL); 
         printf("RECNUM %d\n sqlState = %s\n nError = %d\n Error Message %s\n nativeError %s \n", 
           recnum, sqlState, nError, (char *) eMsg, (char *)nativeError); 
       } 
       recnum++; 
     } 
} 

我一直在嘗試SQLGetDiagField使用diagId的不同變體:SQL_DIAG_MESSAGE_TEXTSQL_DIAG_NATIVESQL_DIAG_SQLSTATE。 我得到了一切,但沒有PostgreSQL錯誤ID。 我不斷得到Postgresql錯誤代碼id = -1

所以我的問題是:

是否有可能使用unixODBC的API來獲取本地PostgreSQL的錯誤代碼ID? 你能告訴我我做錯了什麼嗎?

回答

0

我找到了一個解決方案。

配置文件ODBCINST.INI的內容爲以下幾點:

[PostgreSQL] 
Description=PostgreSQL ODBC driver 
Driver=/usr/lib64/unixODBC/libodbcpsql.so 
FileUsage=1 

後,我改變了配置文件中我能得到PostgreSQL的本地錯誤代碼的驅動程序條目的說明。

[PostgreSQL] 
Description=PostgreSQL ODBC driver 
Driver=/opt/PostgreSQL/psqlODBC/lib/psqlodbcw.so 
FileUsage=1 

psqlodbcw.so庫由EnterpriseDB公司的PostgreSQL可以在這裏下載https://www.postgresql.org/download/linux/suse/供應。

經過這些修改後,我可以得到本地錯誤代碼。使用上面提供的代碼,postgres錯誤代碼值將被寫入sqlState