ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。
基本流程:
(1)初始化COM库,引入ADO库定义文件
(2)用Connection对象连接数据库
(3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记 录集进行查询、处理。
(4)使用完毕后关闭连接释放对象。
(1)初始化:初始化COM库,引入ADO库定义文件
::CoInitialize(NULL);
(2)连接:用Connection对象连接数据库。
_ConnectionPtr m_pConnection;
_ConnectionPtr ConnectDB(_ConnectionPtr pConnection, CString strServerDriver, CString strServerAddress, CString strServerPort, CString strDatabaseName, CString strUserName, CString strPassword)
{
try
{
pConnection.CreateInstance(__uuidof(Connection));
CString strConnection;
strConnection = _T("Provider=MSDASQL.1;Persist Security Info=True;Driver=") + strServerDriver + _T(";SERVER=") + strServerAddress + _T(";PORT=") + strServerPort + _T(";DATABASE=") + strDatabaseName + _T(";UserID=") + strUserName + _T("Password=") + strPassword + _T(";UID=") + strUserName + _T(";PWD=") + strPassword + _T(";");
pConnection->ConnectionTimeout = 15;
if (pConnection->Open(_bstr_t(strConnection), "", "", adModeUnknown) == 0)
{
return pConnection;
}
}
catch (_com_error e)
{
g_pMngEvent->AddEvent(_T("操作记录"), m_strName + _T("连接数据库出错,10s后尝试下一次连接"));
Sleep(10000);
return ConnectDB(pConnection, strServerDriver, strServerAddress, strServerPort, strDatabaseName, strUserName, strPassword);
}
}
_RecordsetPtr m_pRecordset;
_RecordsetPtr GetRecordset(_ConnectionPtr pConnection, _RecordsetPtr pRecordset, CString strSql)
{
try
{
pRecordset.CreateInstance(__uuidof(Recordset));
pRecordset->CursorLocation = adUseClient;
pRecordset->Open(_variant_t(strSql), _variant_t((IDispatch*)pConnection, true), adOpenDynamic, adLockOptimistic, adCmdText);
//pRecordset->Open((_bstr_t)strSql, pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
return pRecordset;
}
catch (_com_error e)
{
g_pMngEvent->AddEvent(_T("操作记录"), m_strName + _T("打开数据集出错,10s后尝试下一次打开数据集"));
Sleep(10000);
CloseConnection();
m_pConnection = ConnectDB(m_pConnection, m_strServerDriver, m_strServerAddress, m_strServerPort, m_strDatabaseName, m_strUserName, m_strPassword);
return GetRecordset(m_pConnection, pRecordset, strSql);
}
}
(3)执行命令:通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记 录集进行查询、处理。
void StoreData2table()
{
if (m_pRecordset != NULL)
{
m_pConnection->BeginTrans();
int m_size = m_aForecast.GetSize();
for (int i = 0; i < m_adata.GetSize(); i++)
{ m_pRecordset->AddNew();
m_pRecordset->PutCollect("sn", variant_t(data1));
m_pRecordset->PutCollect("name", variant_t(data2));
m_pRecordset->PutCollect("id", _variant_t(data3));
}
m_pRecordset->UpdateBatch(adAffectAll);
m_pConnection->CommitTrans();
CloseRecordset();
g_pMngEvent->AddEvent(_T("操作记录"), "StoreData2table(),存数据成功!");
}
}
(4)关闭连接释放对象。
void CloseRecordset()
{
if (m_pRecordset == NULL)
{
return;
}
if (m_pRecordset->GetState() == adStateOpen)
{
m_pRecordset->Close();
}
if (m_pRecordset)
{
m_pRecordset.Release();
m_pRecordset = NULL;
}
}