来源: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
\N3. 接着,先让我们来实现它的创建及写入操作
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
\N4. 最后,让我们来实现它的读取操作。
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