VC采用COM技术连接数据库(ACCESS)

来源:互联网 发布:域名top有升值空间 编辑:程序博客网 时间:2024/06/05 19:31

第一步、首先要引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里

可以直接在Stdafx.h文件中加入下面语句来实现:

#import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename("EOF", "adoEOF") 

【在MFC中路径要用"/"或者"//"】

说明:#import语句实际上相当于执行了API涵数LoadTypeLib()。#import语句会在工程可执行程序输出目录中产生两个文件,分别为*.tlh(类型库头文件)及*.tli(类型库实现文件),它们分别为每一个接口产生智能指针,并为各种接口方法、枚举类型,CLSID等进行声明,创建一系列包装方法。语句no_namespace说明ADO对象不使用命名空间,rename ("EOF", "adoEOF")说明将ADO中结束标志EOF改为adoEOF,以避免和其它库中命名相冲突。

 

第二步、在程序初始过程中需要初始化组件,一般可以用CoInitialize(NULL);来实现,这种方法在结束时要关闭初始化的COM,可以用下面语句CoUnInitialize();来实现。在MFC中还可以采用另一种方法来实现初始化COM,这种方法只需要一条语句便可以自动为我们实现初始化COM和结束时关闭COM的操作,语句如下所示: AfxOleInit();

 

第三步、#import语句引用类型库时,生成的包装类.tlh中声明的智能指针中其中的三个是比较重要的,它们分别是_ConnectionPtr、_RecordsetPtr和_CommandPtr。

 

第四步、实现代码:

新建一个Generic Class,取名AdoAccess。

在public:下添加成员函数

    _ConnectionPtr   m_pConnection; // 数据库       _RecordsetPtr    m_pRecordset; // 命令       _CommandPtr      m_pCommand; // 记录      void OnInitADOConn();//初始化对象函数      void ExitConnect();//卸载

上面两个函数的实现:

void AdoAccess::OnInitADOConn(){::CoInitialize(NULL);try{    m_pConnection.CreateInstance("ADODB.Connection");    //或者 m_pConnection.CreateInstance(__uuidof(Connection));        CString szConnectStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\1.mdb;Persist Security Info=False";                   m_pConnection->Open((_bstr_t)szConnectStr,"","",adModeUnknown);                 AfxMessageBox("连接成功");}catch(_com_error e){   AfxMessageBox("连接失败");}}//这里是连接master数据库,无密码。void AdoAccess::ExitConnect(){   if(m_pRecordset!=NULL)  m_pRecordset->Close();   m_pConnection->Close();  ::CoUninitialize();}


 


具体使用:

查询数据:  

m_pRecordset.CreateInstance("ADODB.Recordset");   m_pRecordset->Open("SELECT * FROM Type",m_pConnection.GetInterfacePtr(),    adOpenDynamic,    adLockOptimistic,    adCmdText);   while(!m_pRecordset->adoEOF)   {    _variant_t var;    CString strValue ;   var = m_pRecordset->GetCollect("Type");//根据字段名获取值    if(var.vt != VT_NULL)    strValue = (LPCSTR)_bstr_t(var);       AfxMessageBox(strValue);    m_pRecordset->MoveNext();   }//end while


插入数据 可以先用AddNew()方法新增一个空记录,再用PutCollect(字段名,值)输入每个字段的值,最后再Update()更新到库中数据既可。其中变量m_Name和m_Age分别为姓名及年龄编辑框的成员变量名。代码所下所示:

 

try {  // 写入各字段值  m_pRecordset->AddNew();  m_pRecordset->PutCollect("Name", _variant_t(m_Name));  m_pRecordset->PutCollect("Age", atol(m_Age));  m_pRecordset->Update();  AfxMessageBox("插入成功!"); } catch(_com_error *e) {  AfxMessageBox(e->ErrorMessage()); }

移动记录指针。移动记录指针可以通过MoveFirst()方法移动到第一条记录、MoveLast()方法移动到最后一条记录、MovePrevious()方法移动到当前记录的前一条记录、MoveNext()方法移动到当前记录的下一条记录。但我们有时经常需要随意移动记录指针到任意记录位置时,可以使用Move(记录号)方法来实现,注意: Move()方法是相对于当前记录来移动指针位置的,正值向后移动、负值向前移动,如:Move(3),当前记录是3时,它将从记录3开始往后再移动3条记录位置。代码如下所示:

try {  int curSel =2;//移动的距离  // 先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针  m_pRecordset->MoveFirst();  m_pRecordset->Move(long(curSel));   } catch(_com_error *e) {  AfxMessageBox(e->ErrorMessage()); }

修改记录中字段值。可以将记录指针移动到要修改记录的位置处,直接用PutCollect(字段名,值)将新值写入并Update()更新数据库既可。可以用上面方法移动记录指针,修改字段值代码如下所示:

try {  // 假设对第二条记录进行修改  m_pRecordset->MoveFirst();  m_pRecordset->Move(1);        // 从0开始  m_pRecordset->PutCollect("Name", _variant_t(m_Name));  m_pRecordset->PutCollect("Age", atol(m_Age));  m_pRecordset->Update(); } catch(_com_error *e) {  AfxMessageBox(e->ErrorMessage()); }

删除记录。删除记录和上面修改记录的操作类似,先将记录指针移动到要修改记录的位置,直接用Delete()方法删除它并用Update()来更新数据库既可。代码如下所示:

try {  // 假设删除第二条记录  m_pRecordset->MoveFirst();  m_pRecordset->Move(1);        // 从0开始  m_pRecordset->Delete(adAffectCurrent);  // 参数adAffectCurrent为删除当前记录  m_pRecordset->Update(); } catch(_com_error *e) {  AfxMessageBox(e->ErrorMessage()); }


 

关闭记录集。直接用Close方法关闭记录集并赋于其空值。代码如下所示:

m_pRecordset->Close();m_pRecordset = NULL;


执行SQL语句。先创建一个_CommandPtr实例指针,再将库连接和SQL语句做为参数,执行Execute()方法既可。代码如下所示:

_CommandPtr  m_pCommand;m_pCommand.CreateInstance(__uuidof(Command));m_pCommand->ActiveConnection = m_pConnection;  // 将库连接赋于它m_pCommand->CommandText = "SELECT * FROM DemoTable";  // SQL语句m_pRecordset = m_pCommand->Execute(NULL, NULL,adCmdText); // 执行SQL语句,返回记录集

 

一个完整验证登陆账号和密码的函数

BOOL GetPassword(CString *UserName, CString *Password){//初始化Com对象CoInitialize(NULL);try{//初始化数据库连接对象_ConnectionPtr pConn("ADODB.Connection");        //定义数据库连接字符串         _bstr_t Connection ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\LoginDemo.mdb;Persist Security Info=False";//打开数据库连接pConn->Open(Connection, "", "", adConnectUnspecified);//初始化记录集对象_RecordsetPtr pRs("ADODB.Recordset");CString strSQL;strSQL.Format("%s\"%s\"", "Select * From UserInfo Where UserName like ", UserName->GetBuffer(UserName->GetLength()));//打开指定记录集pRs->Open(_variant_t(strSQL.GetBuffer(strSQL.GetLength())),       _variant_t(pConn, true),   adOpenStatic,   adLockOptimistic,   adCmdText);//访问记录集中数据if (pRs->BOF){//关闭记录集pRs->Close();pRs.Release();//关闭数据库连接pConn->Close();pConn.Release();    UserName->ReleaseBuffer();Password->ReleaseBuffer();return FALSE;}else{strcpy(Password->GetBuffer(255), _bstr_t(pRs->GetCollect("Password")));pRs->Close();pRs.Release();//关闭数据库连接pConn->Close();pConn.Release();UserName->ReleaseBuffer();Password->ReleaseBuffer();return TRUE;}}catch(_com_error &e){::CoUninitialize();::AfxMessageBox(e.ErrorMessage());return FALSE;}}

完整实例下载

http://download.csdn.net/detail/xlh145/5236186

 

原创粉丝点击