天天看點

VC 中使用ADO通路資料庫前言封裝ADO的類常用的ADO資料庫連接配接串

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

vc