求救啊~初学~API通过ODBC读取数据库,解决问题再加100分,老本啊

wangyinet 2006-07-01 04:49:59
代码如下,你可以直接考过去调试
#include <conio.h>//getch()
#include <stdio.h>
#include <afxwin.h>//// MFC core and standard components
#include <sqlext.h> //包含有扩展的ODBC的定义
#include <sql.h> //包含有基本的ODBC API的定义
#pragma comment(lib, "odbc32.lib")

int main(int argc, char* argv[])
{

SQLRETURN sr;
SQLHENV hEnv; //分配odbc环境
SQLHDBC hDbc;//
SQLHSTMT hStmt;//
//
SQLCHAR szName[50];
SQLINTEGER cbName;
//
char szDSN[] = "TestDB";//ODBC数据源
char szUID[] = "sa"; //SQL用户
char szAuthStr[] = ""; //口令
LPCSTR svSQL="select szName from [ApiOdbc]";

//创建环境句柄
sr = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hEnv);
if(sr==SQL_SUCCESS)
{
printf("1~~创建环境句柄SQLAllocHandle Success!\n");
}
sr = SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3,SQL_IS_INTEGER);
if(sr==SQL_SUCCESS)
{
printf("2~~SQLSetEnvAttr Success!\n");
}
//创建连接句柄
sr = SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hDbc);
if(sr==SQL_SUCCESS)
{
printf("3~~创建连接句柄SQL_HANDLE_DBC Success!\n");
}
//设置连接属性
sr = SQLSetConnectAttr(hDbc,SQL_ATTR_LOGIN_TIMEOUT,(void*)5,0);
if(sr==SQL_SUCCESS)
{
printf("4~~设置连接属性SQLSetConnectAttr Success!\n");
}
//连接
sr = SQLConnect(hDbc,(SQLCHAR *)szDSN, SQL_NTS,(SQLCHAR *)szUID,SQL_NTS,(SQLCHAR *)NULL,SQL_NTS);
if(sr == SQL_SUCCESS) -----------------------------------这里不能通过上面返回都是对的
{
printf("5~~连接Connect Success!\n");
}
//分配语句句柄
sr=SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
if(sr==SQL_SUCCESS)
{
printf("6~~分配语句句柄SQL_HANDLE_STMT Success!\n");
}
//执行SQL查询语句
sr=SQLExecDirect(hStmt,(UCHAR *)svSQL,SQL_NTS);
if (sr == SQL_SUCCESS)
{
printf("7~~执行SQL查询语句SQLExecDirect Success!\n");
while ((sr=SQLFetch(hStmt))!=SQL_NO_DATA)
{
//执行SQL语句后遍历结果集来得到数据
SQLGetData(hStmt, 2, SQL_C_CHAR, szName, 50, &cbName);
printf("%s\n",szName);
}
}

//断开数据库连接
sr = SQLDisconnect(hDbc);
if(hDbc != SQL_NULL_HANDLE)
SQLFreeHandle(SQL_HANDLE_DBC,hDbc);
if(hDbc != SQL_NULL_HANDLE)
SQLFreeHandle(SQL_HANDLE_ENV,hEnv);
if(hStmt!=NULL)
SQLFreeStmt( hStmt, SQL_DROP );

printf("Hello API ODBC!\n");
getch();
return 0;
}


解决问题再加100分,拼老本啊
Email :guemcit@163.com

...全文
254 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
折腾_苏州 2006-07-04
  • 打赏
  • 举报
回复
那跟你的ODBC设置的有问题.
wangyinet 2006-07-02
  • 打赏
  • 举报
回复
是有上面的问题,可修改后还是不行啊,还是在 //连接 那里出现问题~~~我整理了一下,帮看看啊,怎么就连接不上呢??????

#include <conio.h>//getch()
#include <stdio.h>
#include <afxwin.h>//// MFC core and standard components
#include <sqlext.h> //包含有扩展的ODBC的定义
#include <sql.h> //包含有基本的ODBC API的定义
#pragma comment(lib, "odbc32.lib")

int main(int argc, char* argv[])
{

SQLRETURN sr;
SQLHENV hEnv; //分配odbc环境
SQLHDBC hDbc;//
SQLHSTMT hStmt;//
//
SQLCHAR szName[50];
SQLINTEGER cbName;
//
char szDSN[] = "TestDB";//ODBC数据源
char szUID[] = "sa"; //SQL用户
char szAuthStr[] = ""; //口令
LPCSTR svSQL="select * from [ApiOdbc]";//

//创建环境句柄
sr = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hEnv);
if(sr==SQL_SUCCESS)
{
printf("1~~创建环境句柄SQLAllocHandle Success!\n");
}
sr = SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3,SQL_IS_INTEGER);
if(sr==SQL_SUCCESS)
{
printf("2~~SQLSetEnvAttr Success!\n");
}
//创建连接句柄
sr = SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hDbc);
if(sr==SQL_SUCCESS)
{
printf("3~~创建连接句柄SQL_HANDLE_DBC Success!\n");
}
//设置连接属性
sr = SQLSetConnectAttr(hDbc,SQL_ATTR_LOGIN_TIMEOUT,(void*)5,0);
if(sr==SQL_SUCCESS)
{
printf("4~~设置连接属性SQLSetConnectAttr Success!\n");
}
//连接
sr = SQLConnect(hDbc,(SQLCHAR *)szDSN, SQL_NTS,(SQLCHAR *)szUID,SQL_NTS,(SQLCHAR *)NULL,SQL_NTS);
if(sr == SQL_SUCCESS||sr == SQL_SUCCESS_WITH_INFO)
{
printf("5~~连接Connect Success!\n");
}
//分配语句句柄
sr=SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
if(sr==SQL_SUCCESS)
{
printf("6~~分配语句句柄SQL_HANDLE_STMT Success!\n");
}
//执行SQL查询语句
sr=SQLExecDirect(hStmt,(UCHAR *)svSQL,SQL_NTS);
if (sr == SQL_SUCCESS)
{
printf("7~~执行SQL查询语句SQLExecDirect Success!\n");
while ((sr=SQLFetch(hStmt))!=SQL_NO_DATA)
{
//执行SQL语句后遍历结果集来得到数据
SQLGetData(hStmt, 3, SQL_C_CHAR, szName, 50, &cbName);
printf("%s\n",szName);
}
}

//释放
if(hStmt!=NULL)
SQLFreeStmt( hStmt, SQL_DROP );
//断开数据库连接
sr = SQLDisconnect(hDbc);
if(hDbc != SQL_NULL_HANDLE)
SQLFreeHandle(SQL_HANDLE_DBC,hDbc);
if(hDbc != SQL_NULL_HANDLE)
SQLFreeHandle(SQL_HANDLE_ENV,hEnv);


printf("Hello API ODBC!\n");
getch();
return 0;
}




折腾_苏州 2006-07-01
  • 打赏
  • 举报
回复
这段程序有三个小问题:
1.//连接
sr = SQLConnect(hDbc,(SQLCHAR *)szDSN, SQL_NTS,(SQLCHAR *)szUID,SQL_NTS,(SQLCHAR *)NULL,SQL_NTS);
这里如果连接成功可以返回的是SQL_SUCCESS_WITH_INFO(General warning Driver-specific informational message,有 warning)而不并只有SQL_SUCCESS

2.执行LPCSTR svSQL="select szName from [ApiOdbc]";后返回一列数据
而你
//执行SQL语句后遍历结果集来得到数据
SQLGetData(hStmt, 2, SQL_C_CHAR, szName, 50, &cbName);取第二列数据,当然取不到,
sql语句改为select * from [ApiOdbc];

3.if(hStmt!=NULL)SQLFreeStmt( hStmt, SQL_DROP );
要在断开数据库sr = SQLDisconnect(hDbc); 连接前释放

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧