#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語言板塊,但是貌似沒有人理,所以這次發到資料庫板塊,希望有大神幫我解決一下)
uj5u.com熱心網友回復:
最后我自己解決了,不過呼叫的是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");
}
uj5u.com熱心網友回復:
您好,我現在也遇到同樣的情況,連接access就是連接不上,請問你最后有沒有試連接access成功的?轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/106433.html
標籤:Access
