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

Mio_Mikoto 2016-05-23 08:45:25
#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中去了(其实我不懂这样做的目的)

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

这是数据库

希望大家帮我解决一下这个问题,谢谢!(之前发在C语言板块,但是貌似没有人理,所以这次发到数据库板块,希望有大神帮我解决一下)
...全文
1978 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_40849854 2017-10-30
  • 打赏
  • 举报
回复
您好,我现在也遇到同样的情况,连接access就是连接不上,请问你最后有没有试连接access成功的?
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");
}

7,713

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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