刚翻了些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;
}
#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;
}
解决方案 »
- 'listbox' : undeclared identifier syntax error : identifier 'CListBox'
- 树控件 复选框问题
- 高手赐教: MFC Extention DLL没有头文件和库文件,如何使用之
- 如何创建命令行窗口的程序,又能支持多线程呢
- 什么是屏幕坐标,什么是设备坐标?
- 高分寻求源代码!!!!点对点文件传输,一定要能完整传输word,excel文件!
- SQL表里有一个自己增长的ID(IDENTITY(1,1)),在INSERT一个记录后如何知道S自动写入的ID是什么
- 截屏不能捕获半透明窗口
- 非模式窗口的问题
- How to do?
- 调用oracle带有输出参数存储过程的问题
- DAO接口如何存储图片到ACCESS数据库中的OLE对象字段?
while 里面没必要有SQLFetch了吧
没有赋值啊,所以下面的循环始终出不来
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;
}
{
printf("\t%d\t%s\t%f\n", iID, strName, fScore);
}