Programming Technology

VC下利用ADO访问Access数据库(Use ADO)

VC下利用ADO直接访问Access数据库步骤不需要用户建立ODBC数据源)

1.包含相关动态链接库

  1. //在StdAfx.h中,最后部分添加(注意:一定要在最后部分,否则会编译出错)
  2. #import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")


2.连接的创建与初始化

  1. //相关成员变量
  2. _ConnectionPtr m_conn;
  3. _RecordsetPtr m_res;
  4.  
  5. //成员函数块(一般写在CDocment类构造函数即可)
  6. try
  7. {
  8.         CoInitialize(NULL);
  9.         m_conn.CreateInstance(_uuidof(Connection));
  10.         CString strFileName;
  11.         strFileName = "MYBASE.mdb";     //添加相应你的数据库的文件名,编辑状态应放在源文件目录下
  12.         m_conn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFileName,
  13.                 "","",adConnectUnspecified);            //用户名,密码
  14.         m_res.CreateInstance(_uuidof(Recordset));
  15. }
  16. catch(_com_error e)     //异常检测
  17. {
  18.         AfxMessageBox("数据库连接错误!",MB_ICONEXCLAMATION);
  19.         exit(0);        //错误,程序退出
  20. }


3.数据库相关操作(操作方法很多,这里只提供一种简易操作)
假设数据库表设计如下:
表名: MYTABLE
表设计:
自动编号类型 ID
字符串类型 NAME
BOOL类型 SEX

(1)增

  1. _variant_t m_resa;      //可声明为成员变量
  2.  
  3. CString strMyName = "MyName";
  4. CString strSex = "true";
  5.  
  6. CString sql;
  7. sql = "insert into MYTABLE (NAME,SEX) ";
  8. sql += "values ('" + strMyName +"',";
  9. sql += " " + strSex + " ";
  10. sql += ")";
  11.  
  12. try
  13. {
  14.         m_conn->Execute((_bstr_t)sql,&m_resa,adCmdText);        //执行"增"操作
  15. }
  16. catch(_com_error e)
  17. {
  18.         AfxMessageBox("数据库增错误",MB_ICONEXCLAMATION);
  19.         exit(0);        //错误,程序退出
  20. }


(2)删

  1. _variant_t m_resa;      //可声明为成员变量
  2.  
  3. CString strID = "1";    //所要删除记录的ID号
  4. CString sql;
  5.  
  6. sql = "delete from MYTABLE ";   //注意需要有空格
  7. sql += "where ID = " + strID;   //其他语法详查SQL语句
  8.  
  9. try
  10. {
  11.         m_conn->Execute((_bstr_t)sql,&m_resa,adCmdText);        //执行"增"操作
  12. }
  13. catch(_com_error e)
  14. {
  15.         AfxMessageBox("数据库删错误",MB_ICONEXCLAMATION);
  16.         exit(0);        //错误,程序退出
  17. }


(3)改

  1. _variant_t m_resa;      //可声明为成员变量
  2.  
  3. CString sql;
  4. CString strMyName = "MyName";
  5. CString strSex = "true";
  6. CString strID = "1";    //所要更新的记录ID
  7.  
  8. sql = "update MYTABLE set ";
  9. sql += "NAME = '" + strMyName +"', ";
  10. sql += "SEX = " + strSex + " ";
  11. sql += "where id = " + strID;
  12.  
  13. try
  14. {
  15.         m_conn->Execute((_bstr_t)sql,&m_resa,adCmdText);        //执行"增"操作
  16. }
  17. catch(_com_error e)
  18. {
  19.         AfxMessageBox("数据库删错误",MB_ICONEXCLAMATION);
  20.         exit(0);        //错误,程序退出
  21. }


(4)查

  1. _variant_t m_resa;      //可声明为成员变量
  2. CString sql;
  3. sql = "Select * from MYTABLE"//查询语句改变,相应下面的语句也要改变
  4.  
  5. //#include <afxtempl.h> //需加入头文件
  6. //CArray<CMyClass,CMyClass&> m_Array;   //可用容器保存你取得的数据
  7.  
  8. try
  9. {
  10.         m_res = m_conn->Execute((_bstr_t)sql,&m_resa,adCmdText);
  11. }
  12. catch(_com_error e)
  13. {
  14.         AfxMessageBox("数据库查错误",MB_ICONEXCLAMATION);
  15.         exit(0);
  16. }
  17.  
  18. //m_Array.RemoveAll();  //清空容器
  19.  
  20. try
  21. {
  22.         while(!m_res->adoEOF)   //循环遍历记录
  23.         {
  24.                 _variant_t vID, vName, vSex;
  25.                
  26.                 vID = m_res->GetCollect("ID");
  27.                 vName = m_res->GetCollect("NAME");
  28.                 vSex = m_res->GetCollect("SEX");
  29.        
  30.                 ///////////////////////////////////////////////
  31.                 int nID;
  32.                 nID = (long)vID.lVal;
  33.                 ///////////////////////////////////////////////
  34.                 CString strName;
  35.                 if(VT_NULL != vName.vt )        //如果数据不为空
  36.                 {
  37.                         strName = (LPCTSTR)vName.bstrVal;
  38.                 }
  39.                 ///////////////////////////////////////////////
  40.                 bool bSex;
  41.                 if(VT_NULL != vSex.vt )
  42.                 {
  43.                         bSex = (bool)vSex.boolVal;
  44.                 }
  45.                 ////////////////////////////////////////////////
  46.                
  47.                 //CMyClass one(nID, strName, bSex);     //创建数据对象
  48.                 //m_Array.Add(one);     //加入数组
  49.                
  50.                 m_res->MoveNext();      //移动到下一条记录
  51.         }
  52. }
  53. catch(_com_error e)
  54. {
  55.         AfxMessageBox("数据库查错误",MB_ICONEXCLAMATION);
  56.         exit(0);
  57. }


4.关闭数据库

  1. try
  2. {
  3.         if(m_res != NULL)
  4.         {
  5.                 m_res->Close()//关闭记录集
  6.         }
  7.         if(m_conn != NULL)
  8.         {
  9.                 m_conn->Close();        //关闭连接
  10.         }
  11. }
  12. catch(_com_error e)
  13. {
  14.         AfxMessageBox("数据库关闭错误",MB_ICONEXCLAMATION);
  15.         exit(0);
  16. }


5.总结
数据库操作多种多样,可以查查相关资料
这里只介绍了简单的一种操作,面向对象封装一下,直接调用即可

Re: 楼下

是放在工程目录下,也就是程序目录下,不是放在exe的目录下~

Comment by Wupei (2009/02/26 22:06)

请教了!!

用ADO连接ACCESS数据库时,
try
{
// 打开本地Access库Demo.mdb
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=Test.mdb",
"","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox("数据库连接失败!");
return FALSE;
}
为什么总是出错,Test.mdb文件应该放在那里啊?是放在程序当前目录下吗!为什么总是提示"数据库连接失败!"

Comment by 笔记 (2009/02/25 22:29)

发表评论 ( 如果您刚刚提交过评论,但是还没有被显示出来,请点击这里刷新一下: 刷新评论 )

标题

内容*

昵称*

电子邮件

个人网页


 authimage