Error handling SQLExecDirect失败,但SQLGetDiagRec没有数据

Error handling SQLExecDirect失败,但SQLGetDiagRec没有数据,error-handling,odbc,Error Handling,Odbc,我试图在使用ODBC的程序中设置一些有用的错误处理。根据文档,如果SQLExecDirect返回SQL\u错误,我应该能够调用SQLGetDiagRec来获取SQL\u状态和可能的一些消息,但是在我的测试中,当我从SQLExecDirect获取错误后立即调用SQLGetDiagRec时,我得到的SQL\u没有返回任何数据,也没有任何信息 代码: result=SQLExecDirect(hstmt、SQL); 如果(结果==SQL\U错误) { SQLSMALLINT msg_len=0; SQ

我试图在使用ODBC的程序中设置一些有用的错误处理。根据文档,如果SQLExecDirect返回SQL\u错误,我应该能够调用SQLGetDiagRec来获取SQL\u状态和可能的一些消息,但是在我的测试中,当我从SQLExecDirect获取错误后立即调用SQLGetDiagRec时,我得到的SQL\u没有返回任何数据,也没有任何信息

代码:

result=SQLExecDirect(hstmt、SQL);
如果(结果==SQL\U错误)
{
SQLSMALLINT msg_len=0;
SQLCHAR sql_状态[6],消息[256];
SQLINTEGER本机错误=0;
结果=SQLGetDiagRec(SQL\u HANDLE\u DBC、hDbc、1、SQL\u state和native\u error、message、countof(message)和msg\u len);
//这里的“结果”是SQL\u NO\u数据
....
}
它在其他情况下也可以工作,只是出于某些原因,SQLExecDirect不能工作。我也知道应该循环使用SQLGetDiagRec结果,但根据文档,如果第一个返回SQL\u NO\u数据,则意味着没有其他数据

我测试它的具体错误是请求一个不存在的表


为了获得至少一个错误代码,我还需要做些什么吗?或者对于错误的SQL请求导致的错误,诊断不起作用吗?

当调用SQLGetDiagRec时,传递SQL\u HANDLE\u STMT和语句句柄(在您的示例中是hstmt)。这应该会返回与该特定语句相关的错误。

您对此有什么发现吗?我也看到了同样的事情。
result = SQLExecDirect(hstmt, <SQL Statement>, SQL_NTS);

if(result == SQL_ERROR)
{
    SQLSMALLINT msg_len = 0;
    SQLCHAR sql_state[6], message[256];
    SQLINTEGER native_error = 0;

    result = SQLGetDiagRec(SQL_HANDLE_DBC, hDbc, 1, sql_state, &native_error, message, countof(message), &msg_len);

    // Here 'result' is SQL_NO_DATA

    ....
}