C语言通过ODBC连接access数据库总是不成功,求各位大神帮解决,谢谢

Mio_Mikoto 2016-05-23 05:37:34
#include <stdio.h>
#include <stdlib.h>

#include <windows.h>
#include <sqlext.h> //这个应该是必须的, 链结时需要odbc32.lib

int main() {

SQLHENV henv = NULL; //环境句柄
SQLHDBC hdbc = NULL; //odbc连接句柄
SQLHSTMT hstmt = NULL; //语句句柄

SQLRETURN retcode;
SQLCHAR connout[256];
SQLSMALLINT connout_len;
SQLCHAR connstr[] = "Driver={Microsoft Access Driver (*.mdb)};Dbq=E:\\Room AC thermal dynamic calculation\\RTS Data File\\Envelope_Database.mdb;Uid=admin;Pwd=;CharSet=gbk;";

//分配环境
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
//设置环境属性
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
//分配链结
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
//创建数据库链结
retcode = SQLDriverConnect(hdbc, NULL, connstr, SQL_NTS, connout, sizeof(connout), &connout_len, SQL_DRIVER_NOPROMPT);

//retcode = 0;

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {

printf("connnect access ok!\n");
printf("%s\n", connout);

}

else {

printf("failure!\n");
}

}


大家好,小弟是编程方面的新手,在c语言调用access数据库时遇到一些问题不能解决,希望大家帮我一下,谢谢!
我是参照http://blog.csdn.net/jueane/article/details/12034571这篇博客直接copy进VS 2013的,但是retcode =SQLDriverConnect这段返回值总是-1,数据库调用总是不成功。
数据库我已经放到系统DSN中去了(其实我不懂这样做的目的)

也没有设置密码之类的东西

这是数据库

希望大家帮我解决一下这个问题,谢谢!
...全文
166 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-05-31
  • 打赏
  • 举报
回复
在64位Windows下: 64位exe和dll在目录c:\windows\system32目录下; 32位exe和dll在目录c:\windows\syswow64目录下; 所以要注意: 在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。 且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll 在win64位系统下设置32位程序使用的数据库别名要用c:\windows\syswow64\cliconfg.exe 在win64位系统下设置32位程序使用的系统DSN要用c:\windows\syswow64\odbcad32.exe
Mio_Mikoto 2016-05-31
  • 打赏
  • 举报
回复
最后我自己解决了,不过调用的是sql server数据库,不是access数据库。
步骤:
1. 把数据库放到系统DSN中;
2. 写程序;
3. 将项目属性中的“字符集”改为“未设置”(一定要改,否则返回值始终是-1),如下图所示。

附上我写的代码(其实是复制别人的)
#include   <windows.h>   
#include <sqlext.h> //这个应该是必须的, 链结时需要odbc32.lib
#include <stdio.h>
#include <stdlib.h>


void main()
{

SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLRETURN retcode;

/*Allocate environment handle */
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Set the ODBC version environment attribute */
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Allocate connection handle */
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Set login timeout to 5 seconds. */
SQLSetConnectAttr(hdbc, /*(void*)*/SQL_LOGIN_TIMEOUT, (void*)5, 0);

/* Connect to data source */
retcode =SQLConnect(hdbc, (SQLCHAR*) "Wall_PRF", SQL_NTS,(SQLCHAR*) "ABCD", SQL_NTS,(SQLCHAR*) "123456789", SQL_NTS);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
/* Allocate statement handle */
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
printf("Connect Wall_PRF database success!\n");
retcode = SQLPrepare(hstmt, (SQLCHAR*)"select * from Wall_PRF where ID=1", SQL_NTS); //准备sql查询
retcode = SQLExecute(hstmt); //执行SQL命令

SQLINTEGER cbsatid = SQL_NTS;

while (SQLFetch(hstmt) != SQL_NO_DATA_FOUND) //循环从结果集中取每一行数据
{
SQLINTEGER id;
SQLDOUBLE PRF0;
SQLDOUBLE PRF1;
SQLCHAR Weight_Type[42];

SQLGetData(hstmt, 1, SQL_C_LONG, &id, sizeof(SQLINTEGER), &cbsatid);
SQLGetData(hstmt, 2, SQL_C_DOUBLE, &PRF0, sizeof(SQLINTEGER), &cbsatid);
SQLGetData(hstmt, 3, SQL_C_DOUBLE, &PRF1, sizeof(SQLINTEGER), &cbsatid);
SQLGetData(hstmt, 26, SQL_C_CHAR, Weight_Type, 10, &cbsatid);

printf("id is:%ld, PRF[0] is :%lf, PRF[1] is :%lf, Weight_Type is:%s\n", id, PRF0,PRF1, Weight_Type); //打印取得的值}
}

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Process data */

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
SQLDisconnect(hdbc);
}
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
}
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}

system("pause");
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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