VC采用COM技术连接数据库(ACCESS)
2013-03-20 22:37
274 查看
第一步、首先要引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里
可以直接在Stdafx.h文件中加入下面语句来实现:
【在MFC中路径要用"/"或者"//"】
说明:#import语句实际上相当于执行了API涵数LoadTypeLib()。#import语句会在工程可执行程序输出目录中产生两个文件,分别为*.tlh(类型库头文件)及*.tli(类型库实现文件),它们分别为每一个接口产生智能指针,并为各种接口方法、枚举类型,CLSID等进行声明,创建一系列包装方法。语句no_namespace说明ADO对象不使用命名空间,rename
("EOF", "adoEOF")说明将ADO中结束标志EOF改为adoEOF,以避免和其它库中命名相冲突。
第二步、[b]在程序初始过程中需要初始化组件,一般可以用CoInitialize(NULL);来实现,这种方法在结束时要关闭初始化的COM,可以用下面语句CoUnInitialize();来实现。在MFC中还可以采用另一种方法来实现初始化COM,这种方法只需要一条语句便可以自动为我们实现初始化COM和结束时关闭COM的操作,语句如下所示:
AfxOleInit(); [/b]
第三步、#import语句引用类型库时,生成的包装类.tlh中声明的智能指针中其中的三个是比较重要的,它们分别是_ConnectionPtr、_RecordsetPtr和_CommandPtr。
第四步、实现代码:
新建一个Generic Class,取名AdoAccess。
在public:下添加成员函数
上面两个函数的实现:
具体使用:
[b]查询数据: [/b]
插入数据 可以先用AddNew()方法新增一个空记录,再用PutCollect(字段名,值)输入每个字段的值,最后再Update()更新到库中数据既可。其中变量m_Name和m_Age分别为姓名及年龄编辑框的成员变量名。代码所下所示:
移动记录指针。移动记录指针可以通过MoveFirst()方法移动到第一条记录、MoveLast()方法移动到最后一条记录、MovePrevious()方法移动到当前记录的前一条记录、MoveNext()方法移动到当前记录的下一条记录。但我们有时经常需要随意移动记录指针到任意记录位置时,可以使用Move(记录号)方法来实现,注意:
Move()方法是相对于当前记录来移动指针位置的,正值向后移动、负值向前移动,如:Move(3),当前记录是3时,它将从记录3开始往后再移动3条记录位置。代码如下所示:
修改记录中字段值。可以将记录指针移动到要修改记录的位置处,直接用PutCollect(字段名,值)将新值写入并Update()更新数据库既可。可以用上面方法移动记录指针,修改字段值代码如下所示:
删除记录。删除记录和上面修改记录的操作类似,先将记录指针移动到要修改记录的位置,直接用Delete()方法删除它并用Update()来更新数据库既可。代码如下所示:
关闭记录集。直接用Close方法关闭记录集并赋于其空值。代码如下所示:
执行SQL语句。先创建一个_CommandPtr实例指针,再将库连接和SQL语句做为参数,执行Execute()方法既可。代码如下所示:
一个完整验证登陆账号和密码的函数
完整实例下载
http://download.csdn.net/detail/xlh145/5236186
可以直接在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,以避免和其它库中命名相冲突。
第二步、[b]在程序初始过程中需要初始化组件,一般可以用CoInitialize(NULL);来实现,这种方法在结束时要关闭初始化的COM,可以用下面语句CoUnInitialize();来实现。在MFC中还可以采用另一种方法来实现初始化COM,这种方法只需要一条语句便可以自动为我们实现初始化COM和结束时关闭COM的操作,语句如下所示:
AfxOleInit(); [/b]
第三步、#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(); }
具体使用:
[b]查询数据: [/b]
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
相关文章推荐
- VC++之数据库连接Access
- [转]vc连接access 数据库连接之Access数据库连接字符
- 如何获得vc中连接access类型数据库的连接字符串?
- VC如何中如何连接access?
- VC++中使用MFC通过ADO连接数据库方法小结
- vc++连接数据库方式
- access连接数据库
- 使用access连接数据库的相对路径
- VC++中使用MFC通过ADO连接数据库方法小结(不包括异常的捕捉
- python 和 c# 连接数据库 (Access)
- asp中数据库的连接方法(包括access和sql)
- VC+ADO 连接ACCESS和SQL SERVER的区别
- VC通过ADO连接到ACCESS,SQLSERVER,ORACLE数据库(二)
- 20160229 VC++中使用ADO连接数据库
- 在VC中利用ADO连接数据库出现Runtime erro "无效指针"
- vc 2008 access连接时的一些问题
- VC连接数据库
- java连接数据库Oracle|DB2|Sql Server|Sybase|Informix|MySQL||PostgreSQL|access