ODBC SDK编程问题
刚翻了些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;
}