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

第一步、首先要引用支持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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值