您的位置:首页 > 数据库

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

2013-03-20 22:37 274 查看
第一步、首先要引用支持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,以避免和其它库中命名相冲突。


第二步、[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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: