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