GEMINIGHT 警告:您的浏览器不支持JavaScript将无法正常浏览!
Warning: Your browser does not support JavaScript!
📋注册(Register) | 📛登录(Login)
🎲

主站(Home) »  论坛(Forum)  » 程序编写(Program)
GEMINIGHT

自称:发贴器2号
等级:发贴器
帖子数:5173
积分:9588
阅读权限:99
直接通过DAO读写Access文件 1楼
Tags: 数据库

Tags引力关联贴

来源:VC知识库文章

\N

作者:徐景周

\N

下载示例源代码

\N

直接利用DAO来创建、读写Access文件,总的说来,对比上篇《直接通过ODBC读、写Excel文件》来讲,要简单一些。在下面的示例中,我们将用到两种方法:SQL和DAO类函数来混合实现它们,这样做的目地,我想可以使大家更加方便灵活的运用它们来完成你想要做的东西。在示例程序中默认指定创建数据库名为:Demo.mdb,内部表名为:DemoTable,写入两个字段:名字和年龄,采用和上一篇读写Excel类似的操作,你也可以根据自己需要来动态改变它们。示例程序运行界面如下所示:



下面让我们来简要看看它的实现步骤:
1. 首先,应确保包含进了afxdao.h头文件,可以在StdAfx.h文件中包含它,如下:

#include <afxdao.h>         \t\t//加入DAO数据库支持
\N


2. 声明DAO库及其记录集变量,可在你的实现文件中加入下面代码:

CDaoDatabase db;\t\t\t\t\t//数据库\NCDaoRecordset RecSet(&db);\t\t//记录集\N
\N

3. 接着,先让我们来实现它的创建及写入操作

void CRWAccessDlg::OnWriteAccess() \N{\N\t//获取主程序所在路径,存在sPath中\N\tCString sPath;\N\tGetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);\N\tsPath.ReleaseBuffer ();\N\tint nPos;\N\tnPos=sPath.ReverseFind (''\\'');\N\tsPath=sPath.Left (nPos);\N\N\t//默认创建数据名:Demo.mdb,内部表名:DemoTable,表内有二个字段:姓名、年龄\N\tCString lpszFile = sPath + "\\Demo.mdb";\N\t\N\tCFileFind  fFind;\N\tBOOL bSuccess;\N\tbSuccess=fFind.FindFile(lpszFile);\N\N\tfFind.Close ();\N    //是否已有创建好的Demo.mdb文件,没有则创建它\N\tif(!bSuccess)\N\t{\N\t\tdb.Create(lpszFile);\N\N\t\tCString SqlCmd = "CREATE TABLE DemoTable(Name VARCHAR(20),Age VARCHAR(3));";\N\t\tdb.Execute(SqlCmd);\N\t\N\t\t//打开已创建的数据表\N\t\tRecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,\N\t\t\t"SELECT * FROM DemoTable", 0);\N\t\t//加入第一个记录,用SQL语句\N\t\tdb.Execute("INSERT INTO DemoTable (Name,Age) VALUES (''徐景周'',26)");\N\t\t\N\t\t//加入第二个记录,用DAO涵数\N\t\tRecSet.AddNew();\N\t\tRecSet.SetFieldValue("Name","徐志慧");\N\t\tRecSet.SetFieldValue("Age","21");\N\t\tRecSet.Update();\N\t\t\N\t\t//加入第三个记录,用DAO涵数\N\t\tRecSet.AddNew();\N\t\tRecSet.SetFieldValue("Name","郭徽");\N\t\tRecSet.SetFieldValue("Age","27");\N\t\tRecSet.Update();\N\t\t\N\t\t//关闭记录集及库\N\t\tRecSet.Close();\N\t\tdb.Close();\N\N\t\tAfxMessageBox("Access文件写入成功!");\N\t}\N\telse\N\t\tAfxMessageBox("Demo.mdb数据库已经创建!");\N\t\N}\N
\N

4. 最后,让我们来实现它的读取操作。

void CRWAccessDlg::OnReadAccess() \N{\N\tCOleVariant var;\t\t// 字段类型\N\tvar.ChangeType(VT_BSTR, NULL);\N\tCString strName,strAge,strFile; \N\N\t//清空列表框\N\tm_AccessList.ResetContent();\N\N\t//获取主程序所在路径,存在sPath中\N\tCString sPath;\N\tGetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);\N\tsPath.ReleaseBuffer ();\N    int nPos;\N\tnPos=sPath.ReverseFind (''\\'');\N\tsPath=sPath.Left (nPos);\N\N\tstrFile = sPath + "\\demo.mdb";\N\tdb.Open(strFile);\t\t// 打开已创建的demo数据库及DamoTable表\N\tRecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM DemoTable",NULL);\N\N\twhile(!RecSet.IsEOF())\t// 有没有到表结尾\N\t{\N\t\tRecSet.GetFieldValue("Name",var);\N\t\tstrName = (LPCSTR)var.pbstrVal;\N\t\tRecSet.GetFieldValue("Age",var);\N\t\tstrAge = (LPCSTR)var.pbstrVal;\N\t\tm_AccessList.AddString( strName + " --> "+strAge );\N\N\t\tRecSet.MoveNext();\N\t}\N\N\t//关闭记录集及库\N\tRecSet.Close();\N\tdb.Close();\N}\N
\N

以上部分代码的具体实现的细节问题,可在下载实例代码后,仔细查看源码既可(内有详细注释)。

作者联系方式:
地址:陕西省西安市劳动路2号院六单元 徐景周(未来工作室(Future Studio))
邮编:710082
EMAIL:jingzhou_xu@163.net

🗓2006-3-24 07:20(约18年前)  👁960
chengen
注册于:2005年7月28日
等级:高级会员
帖子数:97
积分:1124
阅读权限:40
2楼

老大?

\N

怎么有兴趣发这些基础知识了?

\N

这个,,,,俺在大一的时候就自学过了,

\N

并用他做了个图书馆管理系统,

\N

好多年过去了,

\N

现在用的都是ado了

SIGNATURE
Using codes to create beauty, that is my pride.
🗓2006-3-27 12:23(约18年前)
Jeminai

自称:雙子騎士
注册于:2005年5月26日
等级:站长
帖子数:6428
积分:41808
阅读权限:200
3楼
还不是给人家干活可能要用到嘛(为了开发《异想2》攒点经费),如遇到什么困难我可能还得向您请教呢,还望你不吝赐教。[em44]
SIGNATURE
我的Blog网址:blog.geminight.com
🗓2006-3-28 07:54(约18年前)
chengen
注册于:2005年7月28日
等级:高级会员
帖子数:97
积分:1124
阅读权限:40
4楼

呵呵,在老大面前我可不敢放肆!

\N

不过,很多时候,我们还真得用Access,毕竟它不用像SQL Server那样需要安装服务器。

SIGNATURE
Using codes to create beauty, that is my pride.
🗓2006-3-29 12:44(约18年前)
Jeminai

自称:雙子騎士
注册于:2005年5月26日
等级:站长
帖子数:6428
积分:41808
阅读权限:200
5楼
不用那么谦虚,我还是喜欢和大家保持平等和谐的关系。[em44]
SIGNATURE
我的Blog网址:blog.geminight.com
🗓2006-3-30 19:39(约18年前)
chengen
注册于:2005年7月28日
等级:高级会员
帖子数:97
积分:1124
阅读权限:40
6楼
[em03][em03]
SIGNATURE
Using codes to create beauty, that is my pride.
🗓2006-3-31 12:52(约18年前)
Jeminai

自称:雙子騎士
注册于:2005年5月26日
等级:站长
帖子数:6428
积分:41808
阅读权限:200
7楼
为什么生气啊?[em08]我说错什么了吗?[em41]
SIGNATURE
我的Blog网址:blog.geminight.com
🗓2006-4-1 09:52(约18年前)
chengen
注册于:2005年7月28日
等级:高级会员
帖子数:97
积分:1124
阅读权限:40
8楼

[em06][em06][em06][em06]

\N

原来那个图形叫生气,,搞错了,哈哈

SIGNATURE
Using codes to create beauty, that is my pride.
🗓2006-4-3 13:25(约18年前)

标题(Title):
关键字标签(Tags):
路人:回贴可以不必登录