VC 中使用ADO访问数据库
- 前言
- 封装ADO的类
-
- 使用CAdo的例子
-
- 查询
- 增
- 常用的ADO数据库连接串
-
- Access数据库(xxx.mdb)
- Oracle数据库
前言
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