2014-09-18 72 views
0

我正在學習如何使用C++進行ODBC連接,而且我似乎被困在診斷中。ODBC SQLDetDiagRec返回意外的消息

我使用SQLDriverConnect進行連接調用並接收SQL_SUCCESS_WITH_INFO結果。我想看看有什麼消息。

我對印刷錯誤的功能如下:

void show_error(unsigned int handletype, const SQLHANDLE& handle){ 
    SQLWCHAR sqlstate[1024]; 
    SQLWCHAR message[1024]; 
    if (SQL_SUCCESS == SQLGetDiagRec(handletype, handle, 1, sqlstate, NULL, message, 1024, NULL)) 
    { 
     cout << "Message: " << message << "\nSQLSTATE: " << sqlstate << endl; 
    } 
} 

的資源,我從所有國家學習,從SQLDetDiagRec消息的結果應該是一個非常有用的字符串值,但我的函數返回:

Message: 002EE160 
SQLState: 002ED960 

我錯過了什麼?

回答

0

我終於終於找到了解決方案。事實證明,ODBC有時使用寬字符類型(SQLWCHAR而不是SQLCHAR)。我不知道爲什麼。我猜這取決於你使用的庫。

如果使用SQLWCHAR std :: cout將無法打印寬值。要做到這一點,你需要std :: wcout。

所以把它打印出來的正確方法應該是:

void show_error(unsigned int handletype, const SQLHANDLE& handle){ 
    SQLWCHAR sqlstate[1024]; 
    SQLWCHAR message[1024]; 
    if (SQL_SUCCESS == SQLGetDiagRec(handletype, handle, 1, sqlstate, NULL, message, 1024, NULL)) 
    { 
     std::wcout << "Message: " << message << "\nSQLSTATE: " << sqlstate << endl; 
    } 
} 
0

您看起來是在打印sqlstate和消息的地址而不是其內容。