刚翻了些ODBC API的资料,写了个测试程序,结果死循环,不知道错在哪里,请大虾指教ODBC SDK编程的基本方式:#include <windows.h>
#include <stdio.h>
#include <sqlext.h>
#include <Odbcinst.h>
#define _TUCHAR unsigned char //编译器兼容
#define DSOURCE "TestODBC"
#define USER ""
#define PASS ""
#define SQL "SELECT * FROM stuScore"int main()
{ HENV hEnv=NULL;
HDBC hDBC=NULL;
HSTMT hStmt=NULL;
int             iRet=0;
        SQLCHAR         strName[51];
        SQLDOUBLE        fScore;
        SQLINTEGER      iID,iIDLen,iNameLen,iScoreLen;
        int             iTimeOut=5; //简化演示,所以对返回值并没有作检测和错误处理
iRet=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);//初始化环境并返回对应于该环境的环境句柄
        iRet=SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
        iRet=SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDBC);//每一个到数据源的连接对应于一个连接句柄
iRet=SQLSetConnectAttr(hDBC, SQL_LOGIN_TIMEOUT, &iTimeOut, 0);
iRet=SQLConnect( hDBC, (SQLCHAR*)DSOURCE, SQL_NTS, (SQLCHAR*)USER, SQL_NTS, (SQLCHAR*)PASS, SQL_NTS );
iRet=SQLAllocHandle(SQL_HANDLE_STMT, hDBC, &hStmt);
iRet=SQLExecDirect( hStmt, (SQLCHAR*)SQL, SQL_NTS );
iRet=SQLBindCol(hStmt, 1, SQL_C_ULONG, &iID, 0, &iIDLen);
iRet=SQLBindCol(hStmt, 2, SQL_C_CHAR, strName, 50, &iNameLen);
iRet=SQLBindCol(hStmt, 3, SQL_C_DOUBLE, &fScore, 0, &iScoreLen); printf("\tID\tNAME\tScore\n");        iRet == SQLFetch(hStmt);
while (iRet != SQL_NO_DATA && iRet != SQL_ERROR )//显示完最后一条记录以后就死循环,始终输出最后一条记录,iRet总是返回0,即SQL_SUCCESS
{
printf("\t%d\t%s\t%f\n", iID, strName, fScore);
iRet == SQLFetch(hStmt);
} if( hStmt!=NULL )
SQLFreeHandle(SQL_HANDLE_STMT, hStmt); if( hDBC!=NULL ) {
SQLDisconnect( hDBC );
SQLFreeHandle(SQL_HANDLE_DBC, hDBC); } if( hEnv!=NULL )
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);        return 0;
}

解决方案 »

  1.   

    iRet==SQLFetch();“==”是什么意思?iRet的值始终是SQLBindCol返回的值。
      

  2.   

    iRet == SQLFetch(hStmt);??
    while 里面没必要有SQLFetch了吧
      

  3.   

    iRet == SQLFetch(hStmt);
    没有赋值啊,所以下面的循环始终出不来
      

  4.   

    iRet == SQLFetch(hStmt);
    while (iRet != SQL_NO_DATA && iRet != SQL_ERROR 
    {
    printf("\t%d\t%s\t%f\n", iID, strName, fScore);
    iRet == SQLFetch(hStmt);
    }
    改成:while (1)
    {
     iRet == SQLFetch(hStmt);
    if (iRet != SQL_NO_DATA && iRet != SQL_ERROR 
    {
       printf("\t%d\t%s\t%f\n", iID, strName, fScore);
    }
    else
    {
       break;
    }
      

  5.   

    或者是...for (iRet = ::SQLFetch(hStmt) ; iRet == SOCK_SUCCESS ; iRet = ::SQLFetch(hStmt))
    {
       printf("\t%d\t%s\t%f\n", iID, strName, fScore);
    }