VC 中使用ADO访问数据库

前言

ADO (ActiveX Data Objects,ActiveX数据对象)是Microsoft提出的应用程序接口(API)用以实现访问关系或非关系数据库中的数据。

封装ADO的类

使用msado15.dll
首先在 在stdafx.h中添加

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

CAdo类

#ifndef __CADO_H_H
#define __CADO_H_H

class CAdo
{
private:
	_ConnectionPtr m_pConnection;					//连接对象指针
public:
	_RecordsetPtr  m_pRecordset;					//记录集对象指针


public:
	CAdo(void){ m_pConnection = NULL; m_pRecordset = NULL; }
	~CAdo(void){}
	void InitADOConn();	//连接数据库
	void UnInitADOConn();//关闭记录集,断开与数据库连接
	_RecordsetPtr&  OpenRecordset(const CString& sql);		//打开记录集
	void UpdateDB(const CString& sql);

	UINT GetRecordCount(_RecordsetPtr pRecordset);	//获得记录数
};

inline void CAdo::InitADOConn()
{
	::CoInitialize(NULL);
	try
	{
		m_pConnection.CreateInstance("ADODB.Connection");  //创建连接对象实例,//Or m_pConnection.CreateInstance(_uuidof(Connection));
		_bstr_t strConnect = "DRIVER={Microsoft Access Driver (*.mdb)};uid=;pwd=;DBQ=DataBase2.mdb;";
		//strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DataBase2.mdb;Persist Security Info=False;Jet OLEDB:Database Password=123456";
		m_pConnection->Open(strConnect, "", "", adModeUnknown); //打开数据库
		m_pRecordset .CreateInstance(__uuidof(Recordset));// 创建记录集对象实例或者 m_pRecordset .CreateInstance("ADODB.Recordset");
	}
	catch (_com_error e)
	{
		AfxMessageBox(e.Description()); //弹出错误处理
	}
}

// 查询DB,例如:select * from ...
inline _RecordsetPtr&  CAdo::OpenRecordset(const CString& sql)
{
	ASSERT(!sql.IsEmpty());		//SQL语句不能为空
	try
	{
		if (adStateOpen == m_pRecordset->State)
			m_pRecordset->Close();
		m_pRecordset->Open(_bstr_t(sql), m_pConnection.GetInterfacePtr(),
			adOpenDynamic, adLockOptimistic, adCmdText); 	//执行SQL得到记录集
	}
	catch (_com_error e) //捕获可能的异常
	{
		AfxMessageBox(e.Description());
	}
	return m_pRecordset;
}

// 更新DB,例如:update t_user set ... 或者 INSERT INTO 或者 delete from
inline void CAdo::UpdateDB(const CString& sql)
{
	ASSERT(!sql.IsEmpty());										//SQL语句不能为空
	try
	{
		m_pConnection->Execute((_bstr_t)sql, NULL, adCmdText);
	}
	catch (_com_error e)											//捕获可能的异常
	{
		AfxMessageBox(e.Description());
	}
	return;
}

inline
void CAdo::UnInitADOConn()
{
	if (m_pRecordset != NULL && m_pRecordset->GetState() == adStateOpen //判断当前的记录集状态
		m_pRecordset->Close();					//关闭记录集
	if (m_pConnection)
		m_pConnection->Close();	//关闭数据库连接
	::CoUninitialize();			//释放COM环境
}



inline
UINT CAdo::GetRecordCount(_RecordsetPtr pRecordset)
{
	int nCount = 0;											//声明保存记录数的变量
	try{
		pRecordset->MoveFirst();								//将记录集指针移动到第一条记录
	}
	catch (...)												//捕捉可能出现的错误
	{
		return 0;											//产生错误时返回0
	}
	if (pRecordset->adoEOF)									//判断记录集中是否没有记录
		return 0;											//无记录时返回0
	while (!pRecordset->adoEOF)								//当记录集指针没有指向最后时
	{
		pRecordset->MoveNext();								//将记录集指针移动到下一条记录
		nCount = nCount + 1;								//记录个数的变量加1
	}
	pRecordset->MoveFirst();									//将记录集指针移动到第一条记录
	return nCount;											//返回记录数
}

#endif //__CADO_H_H

使用CAdo的例子

查询

CAdo ado;
ado.InitADOConn();
//查询
CString sql = "select * from employees";
ado.m_pRecordset = ado.OpenRecordset(sql);
try
{
	while(!ado.m_pRecordset->adoEOF)
	{
		_variant_t var = ado.m_pRs->GetCollect((_bstr_t)"name");
		var = ado.m_pRs->GetCollect("编号");
		var = ado.m_pRs->GetCollect((_bstr_t)"pwd");
		ado.m_pRs->MoveNext();
	}
	
}
catch(...)
{
	MessageBox("操作失败");
	return;
}
MessageBox("成功");
ado.UnInitADOConn();

CAdo ado;
ado.InitADOConn();
//增删改
CString sql = "insert into employees...";
ado.UpdateDB(sql);
ado.UnInitADOConn();

或者

	//ADO ado;
	//ado.OnInitADOConn();
	//CString sql = "select * from employees";
	//ado.m_pRecordset = ado.OpenRecordset(sql);
	//try
	//{
	//	ado.m_pRecordset->AddNew(); //添加新行
	//	ado.m_pRecordset->PutCollect("编号",(_bstr_t)m_ID);
	//	ado.m_pRecordset->PutCollect("姓名",(_bstr_t)m_Name);
	//	ado.m_pRecordset->PutCollect("学历",(_bstr_t)m_Culture);
	//	ado.m_pRecordset->Update(); //更新数据表记录
	//	ado.CloseRecordset();
	//	ado.CloseConn();
	//}
	//catch(...)
	//{
	//	MessageBox("操作失败");
	//	return;
	//}
	//MessageBox("添加成功");
	//m_Grid.DeleteAllItems(); //删除列表控件
	//AddToGrid();	

ADO ado;
ado.OnInitADOConn();
CString sql = "select * from employees";
ado.m_pRecordset = ado.OpenRecordset(sql);
try
{
	ado.m_pRecordset->Move((long)pos,vtMissing);
	ado.m_pRecordset->PutCollect("编号",(_bstr_t)m_ID);
	ado.m_pRecordset->PutCollect("姓名",(_bstr_t)m_Name);
	ado.m_pRecordset->PutCollect("学历",(_bstr_t)m_Culture);
	ado.m_pRecordset->Update();
	ado.CloseRecordset();
	ado.CloseConn();
}
catch(...)
{
	MessageBox("操作失败");
	return;
}
MessageBox("修改成功");

常用的ADO数据库连接串

Access数据库(xxx.mdb)

// .mdb数据库,没有数据库密码的连接串
		_bstr_t strConnect = "DRIVER={Microsoft Access Driver (*.mdb)};uid=;pwd=;DBQ=DataBase2.mdb;";
		//或者
		strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DataBase2.mdb;Persist Security Info=False;";

// .mdb数据库,有数据库密码的连接串
	_bstr_t strConnect = "DRIVER={Microsoft Access Driver (*.mdb)};uid=;pwd=123456;DBQ=DataBase2.mdb;";
	//或者
	strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DataBase2.mdb;Persist Security Info=False;Jet OLEDB:Database Password=123456";

Oracle数据库

使用Oracle客户端(32位)的提供的Driver

strConnect = "Provider=OraOLEDB.Oracle.1;Persist Security Info=False;User ID=xili;Data Source=127.0.0.1:1521/myorcl"

"Provider=OraOLEDB.Oracle.1;Persist Security Info=True;User ID=xili;Password=xili;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=myorcl)));"

[oledb]
; Everything after this line is an OLE DB initstring
Provider=OraOLEDB.Oracle.1;Password=xili;Persist Security Info=True;User ID=xili;Data Source=127.0.0.1:1521/myorcl


Persist Security Info属性的意思是表示是否保存安全信息,其实可以简单的理解为"ADO在数据库连接成功后是否保存密码信息",True表示保存,False表示不保存
源自:https://www.cnblogs.com/zhangchenliang/archive/2012/09/21/2696725.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值