預備:
(1)、引入ADO類
#import "c:program filescommon filessystemadomsado15.dll"
no_namespace
rename ("EOF", "adoEOF")
(2)、初始化COM
在MFC中可以用AfxOleInit();非MFC環境中用:
CoInitialize(NULL);
CoUnInitialize();
(3)#import 包含後就可以用3個智能指針了:_ConnectionPtr、_RecordsetPtr和_CommandPtr
1.連接和關閉數據庫
(1)連接
例子:連接Access數據庫
AfxOleInit();//初始化
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///創建Connection對象
if(SUCCEEDED(hr))
{
m_pConnection->ConnectionTimeout = 0;
hr = m_pConnection->Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb", "", "", adModeUnknown);
//m_pConnection->PutDefaultDatabase ((_bstr_t)"DB");//設置默認數據庫
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->CommandTimeout = 5;
m_pCommand->ActiveConnection = m_pConnection;
}
}
catch(_com_error e)///捕捉異常
{
CString errormessage;
errormessage.Format("連接數據庫失敗!
錯誤信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///顯示錯誤信息
}
(2)、關閉
//假如數據庫連接有效
if( m_pConnection->State )
m_pConnection->Close();
m_pConnection = NULL;
(3)、設置連接時間 //設置連接時間-----------------------------------
pConnection->put_ConnectionTimeout(long(5));
2.打開一個結果集
(1)打開,首先創建一個_RecordsetPtr實例,然後調用Open()得到一條SQL語句的執行結果
_RecordsetPtrm_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 在ADO操作中建議語句中要常用try...catch()來捕捉錯誤信息,
// 因為它有時會經常出現一些意想不到的錯誤。jingzhou xu
try
{
m_pRecordset->Open("SELECT * FROM DemoTable",// 查詢DemoTable表中所有字段
m_pConnection.GetInterfacePtr(), // 獲取庫接庫的IDispatch指針
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
(2)關閉結果集 m_pRecordset->Close();
3.操作一個結果集
(1)、遍歷(讀取)
a)、用pRecordset->adoEOF來判定數據庫指針是否已經移到結果集的末尾了;m_pRecordset->BOF判定是否 在第一條記錄前面: while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("Age");
if(var.vt != VT_NULL)
strAge = (LPCSTR)_bstr_t(var);
m_AccessList.AddString( strName + " --> "+strAge );
m_pRecordset->MoveNext();
}
b)、取得一個字段的值的辦法有兩種辦法
一是
//表示取得第0個字段的值 m_pRecordset->GetCollect("Name");
或者 m_pRecordset->GetCollect(_variant_t(long(0));
二是
pRecordset->get_Collect("COLUMN_NAME");
或者 pRecordset->get_Collect(long(index));
(2)、添加
a)、調用m_pRecordset->AddNew();
b)、調用m_pRecordset->PutCollect();給每個字段賦值
c)、調用m_pRecordset->Update();確認
(3)、修改
(4)、刪除
a)、把記錄指針移動到要刪除的記錄上,然後調用Delete(adAffectCurrent) try
{
// 假設刪除第二條記錄
m_pRecordset->MoveFirst();
m_pRecordset->Move(1);
// 從0開始
m_pRecordset->Delete(adAffectCurrent);
// 參數adAffectCurrent為刪除當前記錄
m_pRecordset->Update();
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
預備:
(1)、引入ADO類
#import "c:program filescommon filessystemadomsado15.dll"
no_namespace
rename ("EOF", "adoEOF")
(2)、初始化COM
在MFC中可以用AfxOleInit();非MFC環境中用:
CoInitialize(NULL);
CoUnInitialize();
(3)#import 包含後就可以用3個智能指針了:_ConnectionPtr、_RecordsetPtr和_CommandPtr
1.連接和關閉數據庫
(1)連接
例子:連接Access數據庫
AfxOleInit();//初始化
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///創建Connection對象
if(SUCCEEDED(hr))
{
m_pConnection->ConnectionTimeout = 0;
hr = m_pConnection->Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb", "", "", adModeUnknown);
//m_pConnection->PutDefaultDatabase ((_bstr_t)"DB");//設置默認數據庫
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->CommandTimeout = 5;
m_pCommand->ActiveConnection = m_pConnection;
}
}
catch(_com_error e)///捕捉異常
{
CString errormessage;
errormessage.Format("連接數據庫失敗!
錯誤信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///顯示錯誤信息
}
(2)、關閉
//假如數據庫連接有效
if( m_pConnection->State )
m_pConnection->Close();
m_pConnection = NULL;
(3)、設置連接時間 //設置連接時間-----------------------------------
pConnection->put_ConnectionTimeout(long(5));
2.打開一個結果集
(1)打開,首先創建一個_RecordsetPtr實例,然後調用Open()得到一條SQL語句的執行結果
_RecordsetPtrm_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 在ADO操作中建議語句中要常用try...catch()來捕捉錯誤信息,
// 因為它有時會經常出現一些意想不到的錯誤。jingzhou xu
try
{
m_pRecordset->Open("SELECT * FROM DemoTable",// 查詢DemoTable表中所有字段
m_pConnection.GetInterfacePtr(), // 獲取庫接庫的IDispatch指針
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
(2)關閉結果集 m_pRecordset->Close();
3.操作一個結果集
(1)、遍歷(讀取)
a)、用pRecordset->adoEOF來判定數據庫指針是否已經移到結果集的末尾了;m_pRecordset->BOF判定是否 在第一條記錄前面: while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("Age");
if(var.vt != VT_NULL)
strAge = (LPCSTR)_bstr_t(var);
m_AccessList.AddString( strName + " --> "+strAge );
m_pRecordset->MoveNext();
}
b)、取得一個字段的值的辦法有兩種辦法
一是
//表示取得第0個字段的值 m_pRecordset->GetCollect("Name");
或者 m_pRecordset->GetCollect(_variant_t(long(0));
二是
pRecordset->get_Collect("COLUMN_NAME");
或者 pRecordset->get_Collect(long(index));
(2)、添加
a)、調用m_pRecordset->AddNew();
b)、調用m_pRecordset->PutCollect();給每個字段賦值
c)、調用m_pRecordset->Update();確認
(3)、修改
(4)、刪除
a)、把記錄指針移動到要刪除的記錄上,然後調用Delete(adAffectCurrent) try
{
// 假設刪除第二條記錄
m_pRecordset->MoveFirst();
m_pRecordset->Move(1);
// 從0開始
m_pRecordset->Delete(adAffectCurrent);
// 參數adAffectCurrent為刪除當前記錄
m_pRecordset->Update();
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}