每天进步一点点:MFC中使用Access数据库

in #database6 years ago

我想在一个小程序中加一点数据库的功能,因为可能需要一些编辑和修改等功能,所以我打算选择Access作为数据库管理系统。这样我可以在程序中查询,又可以在Access软件中浏览和编辑。


(图源 :pixabay)
我是在MFC程序中使用ODBC连接Access数据库。

打开数据库

在使用数据库之前,我们首先需要打开数据库。为了使用数据库,我们需要先包含头文件: afxdb.h。

#include "afxdb.h"

然后声明一个数据库类的实例:

CDatabase db;

指定ODBC Driver:

CString sDriver = TEXT("Microsoft Access Driver (*.mdb, *.accdb)");

指定数据库信息:

CString sDBInfo = TEXT("C:\\Northwind.accdb");

指定连接字符串

CString sConnect;
sConnect.Format(TEXT("ODBC;DRIVER={%s};DSN='';DBQ=%s;"), sDriver, sDBInfo);

之后就可以打开(连接)数据库了。

BOOL ret = db.Open(NULL, false, false, sConnect);

我们可以用返回值判断打开是否成功。之后也可以使用db.IsOpen()来进行判断,当然,也可以将打开数据库的代码段放到TRY{ }CATCH(CDBException, e){ }END_CATCH;代码块中。

访问数据库(查询数据)

成功连接数据库之后,我们就可以访问数据库啦。

在此之前,我们需要声明一个CRecordset实例,并和数据库建立起来关联。

CRecordset recset(&db);

之后就可以准备我们的查询语句了(SQL),比如:

CString sql = TEXT("select * from table_a;");

然后就可以去查询啦:

recset.Open(CRecordset::forwardOnly, sql, CRecordset::readOnly);

然后就可以遍历返回结果啦:

while (!recset.IsEOF())
{
    CString strTmp;
    recset.GetFieldValue(TEXT("field1"), strTmp);

    // Process the row
    .......    

    // goto next record
    recset.MoveNext();
}

处理完所有结果之后记得关闭记录集:

recset.Close();

数据库使用完毕,记得关闭数据库:

db.Close();

其它问题

在Office 2007之前,Access 数据库文件的扩展名为*.mdb,Office 2007之后扩展名变化为*.accdb。针对老版本的数据库文件,我们可以使用如下Driver:

CString sDriver = TEXT("Microsoft Access Driver (*.mdb)");

如果是2007之后版本的Access文件,则要使用:

CString sDriver = TEXT("Microsoft Access Driver (*.mdb, *.accdb)");

另外要注意程序的目标平台(X86 还是X64),以及安装的Office版本(X86 还是X64)等因素,否则会类似如下的错误:

Reveal spoiler

我被这个坑害得一整晚没睡觉😭。

参考资料

Sort:  

你好厉害啊,葱白你

过奖了,都是些过时的东西,我自娱自乐:)

Office坑你沒商量🤣

哈哈,坑呀坑呀就习惯了。

WARNING! The comment below by @ilhamyus leads to a known phishing site that could steal your account.
Do not open links from users you do not trust. Do not provide your private keys to any third party websites.

WARNING - The message you received from @ilhamyus is a CONFIRMED SCAM!
DO NOT FOLLOW any instruction and DO NOT CLICK on any link in the comment!

For more information, read this post:
https://steemit.com/steemit/@arcange/phishing-site-reported-tpm-rotator

If you find my work to protect you and the community valuable, please consider to upvote this warning or to vote for my witness.