一、 導入ADO動態連接庫
在工程的stdafx.h中加入以下語句:
#import "c:\program files\commonfiles\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
二、連接數據庫
新建一個類,用來專門處理數據庫的連接和各種操作
ADO庫包含三個基本接口:_ConnectionPtr接口,_CommandPtr接口,_RecordsetPtr接口。這些都是智能指針,和普通的指針一樣,也需要定義指針變量、創建其實例,然後就可以調用它的方法和屬性。不同的是,改只能指針最後是自動進行內存釋放的,調用Close方法就可以了。
1、_ConnectionPtr接口:該接口返回一個記錄集或一個空指針,通常用它來創建一個數據庫連接,或執行一條不返回任何結果的SQL語句,不推薦用它來返回一個記錄集
2、_CommandPtr接口:返回一個記錄集,提供一種簡單的方法來執行返回記錄集的存儲過程和SQL語句。
3、_RecordsetPtr接口:是一個記錄集對象,對記錄集提供更多的控制功能,多用於得到查詢操作的返回結果。
在類中新建上述上個接口的變量
_ConnectionPtr m_pConnection; m_pConnection.CreateInstance(__unidof(Connection)); //m_pConnection.CreateInstance(“ADODB.Connection”); //第二種方法 _CommandPtr m_pCommand; _RecordsetPtr m_pRecordset;
新建一個函數,專門用於數據庫的連接
_bstr_t strSQL="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=test.mdb";
try
{
m_pConnection.CreateInstance("ADODB.Connection");
m_pConnection->Open(strSQL,"","",adModeUnknown);
}
catch(_com_errore)
{
AfxMessageBox(e.ErrorMessage());
}
關閉連接
m_pConnection->Close();
m_pConnection=NULL;
三、 數據庫的操作
1 查詢:
一般用_RecordsetPtr才完成查詢操作,並存儲得到的結果
HRESULT Recordset15::Open (const _variant_t & Source,
const_variant_t & ActiveConnection,
enumCursorTypeEnum CursorType,
enumLockTypeEnum LockType,
long Options ) ;
參數Source:爲_variant_t類型的引用,可以爲有效的Command對象、SQL語句、表名、存儲過程調用等。
參數ActiveConnection:爲_variant_t類型的引用,爲已經建立好的連接。
參數CursorType:用於設置在打開Recordset時提供者應使用的遊標類型,它可取CursorTypeEnum 中的任一值,默認值爲adOpenForwardOnly。
參數 LockType:用於設置在打開Recordset時提供者應使用的鎖定類型,它可取枚舉LockTypeEnum中的任一值,默認值爲adLockReadOnly。
參數 Options:用於設置獲取Source(即Open第一個參數)的方式,其類型long。
例如:m_pRecordset.CreateInstance(__uuidof(Recordset));
try
{
m_pRecordset->Open("select* from lesson",
m_pConnection.GetInterfacePtr(),//採用已經建好的連接
adOpenDynamic,adLockOptimistic,adCmdText);
_variant_t var;
while(!m_pRecordset->adoEOF) //遍歷結果集中的內容
{
var=m_pRecordset->GetCollect("id");//根據表名來獲得內容
if(var.vt != VT_NULL)
id =(LPCSTR)_bstr_t(var); //獲得表項的內容
m_pRecordset->MoveNext();//指針向下移動
}
}
catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}
2 添加
三種方法:一、用m_pConnection的Open方法;二、用m_pRecordset的Addnew 方法。三、用m_pCommand執行
用m_pConnection的Open方法
_variant_t RecordsAffected;
try
{
CStringstr;
str.Format("insert…………");//插入的SQL語句
m_pConnection->Execute(_bstr_t(str),&RecordsAffected,adCmdText);
}
catch(_com_errore)
{
AfxMessageBox(e.ErrorMessage());
}
用m_pRecordset的Addnew 方法:
m_pRecordset.CreateInstance(__uuidof(Recordset));
try
{
m_pRecordset->Open("select * from tab",
m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);//獲得表
m_pRecordset->AddNew(); //添加操作
m_pRecordset->PutCollect(字段名,新值); //添加表的元素
m_pRecordset->Update(); //執行更新,成功插入
}
catch(_com_errore)
{
AfxMessageBox(e.ErrorMessage());
}
用m_pCommand執行:
m_pCommand.CreateInstance("ADODB.Command");
m_pCommand->ActiveConnection = m_pConnection; //關鍵的一句,將建立的連接賦值給它
m_pCommand->CommandText=“”; //SQL語句
m_pCommand->Execute(NULL,NULL,adCmdText);
用m_pConnection的Open方法:
和添加的m_pConnection方法一樣,只需要修改SQL語句
m_pRecordset方法:
m_pRecordset.CreateInstance(__uuidof(Recordset));
try
{
m_pRecordset->Open("select * from tab where ……",
m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);//獲得要刪除的內容
if(!m_pRecordset->adoEOF)
{
m_pRecordset->MoveFirst();//用來定位
m_pRecordset->Delete(adAffectCurrent);//根據位置刪除
//注:這裏根據自己的需要進行操作,如果有多個結果,則要循環獲得下標進行刪除
}
}
catch(_com_errore)
{
AfxMessageBox(e.ErrorMessage());
}
m_pCommand方法:只需要修改SQL語句即可
4 修改
m_pConnection方法:和添加的m_pConnection方法一樣,只需要修改SQL語句
m_pRecordset方法:
m_pRecordset.CreateInstance(__uuidof(Recordset));
try
{
m_pRecordset->Open("select * from tab ……",
m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);//獲得想要修改的內容
if(!m_pRecordset->adoEOF)
{
m_pRecordset->MoveFirst();//定位,位置自己確定
m_pRecordset->PutCollect(字段名,新值);
m_pRecordset->Update();
}
}
catch(_com_errore)
{
AfxMessageBox(e.ErrorMessage());
}
m_pCommand方法:只需要修改SQL語句即可
注:在此總結,方便自己加深理解,真正掌握,以免以後碰到同樣的問題依舊從頭開始,浪費時間。