另一个简单的 ADO 类






4.61/5 (15投票s)
另一个简单但很酷的 ADO 类,用于您的项目 - 来自 zCoders.com
引言
这里是另一个 ADO 类,适用于您可能即将开展的任何数据库项目。该类从上面的链接提供。我创建这个类是因为我找不到包含断开连接的 recordset
的任何好的 ADO 类。希望这个类能帮助到您。
以下是主要方法
CRADatabase()
~CRADatabase()
RAConnect(char *ConnectionString)
RAGetDisconnectedRs(char *SqlStatement)
RAExecuteNoRs(char *SqlStatement)
RAExecuteRs(char *SqlStatement)
用法
_RecordsetPtr oRs;
CRADatabase rad;
for (int count=0; count<1000; count++)
{
if (S_OK == rad.RAConnect("DSN=Database;UID=sa;PWD="))
{
oRs = rad.RAGetDisconnectedRs("SELECT TOP 100 * FROM orders");
CComVariant val;
if (oRs)
{
while (!oRs->adoEOF)
{
val = oRs->Fields->Item[_variant_t("order_number")]->Value;
if (val.vt != (VT_NULL))
{
printf("%s\n",(char*)_bstr_t(val));
}
oRs->MoveNext();
}
oRs->Release();
oRs->Close();
}
}
}
这是代码(点击上面的链接获取压缩类!)
// RADatabase.cpp: implementation of the CRADatabase class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "RADatabase.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CRADatabase::CRADatabase()
{
try
{
// Initialize COM
CoInitialize(NULL);
// Initialize ADO
m_Command.CreateInstance(__uuidof(Command));
m_Recordset.CreateInstance(__uuidof(Recordset));
m_Connection.CreateInstance(__uuidof(Connection));
}
catch(_com_error &e)
{
printf("Description = %s\n", (char*) e.Description());
}
catch(...)
{
}
}
CRADatabase::~CRADatabase()
{
// Clean up ADO objects
try
{
if (m_Connection)
{
if(m_Connection->State == adStateOpen)
{
m_Connection->Close();
m_Connection.Release();
}
}
if (m_Recordset)
{
if(m_Recordset->State == adStateOpen)
{
m_Recordset->Close();
m_Recordset.Release();
}
}
m_Connection = NULL;
m_Command = NULL;
m_Recordset = NULL;
CoUninitialize();
}
catch(_com_error &e)
{
printf("Description = %s\n", (char*) e.Description());
}
catch(...)
{
}
}
HRESULT CRADatabase::RAConnect(const char *ConnectionString)
{
// Attempt a connect, reconnect, or leave if already connected
if (strlen(ConnectionString) > 0)
{
try
{
if (m_Connection == NULL)
m_Connection.CreateInstance(__uuidof(Connection));
if (0 == _stricmp(ConnectionString, m_ConnectionString) &&
m_Connection->State == adStateOpen)
return S_OK;
else
{
if (m_Connection->State == adStateOpen)
m_Connection->Close();
sprintf(m_ConnectionString, ConnectionString);
}
// Perform the connect
if (S_OK == m_Connection->Open((char*)m_ConnectionString,
L"",
L"",
adModeUnknown))
return S_OK;
}
catch(_com_error &e)
{
printf("Description = %s\n", (char*) e.Description());
}
catch(...)
{
}
}
return E_FAIL;
}
_RecordsetPtr CRADatabase::RAGetDisconnectedRs(const char *SqlStatement)
{
// Attempt get a disconnected RS and terminate the connection to the DB
if (strlen(SqlStatement) > 0)
{
try
{
if (m_Connection == NULL || m_Connection->State == adStateClosed)
RAConnect(m_ConnectionString);
if (m_Recordset)
{
if (m_Recordset->State == adStateOpen)
m_Recordset->Close();
}
else
{
m_Recordset.CreateInstance(__uuidof(Recordset));
}
m_Recordset->CursorLocation = adUseClient;
m_Recordset->Open(SqlStatement,
m_Connection.GetInterfacePtr(),
adOpenForwardOnly,
adLockBatchOptimistic,
-1);
m_Recordset->PutRefActiveConnection(NULL);
if(m_Connection->GetState() == adStateOpen)
m_Connection->Close();
//m_Connection.Release();
//m_Connection = NULL;
return m_Recordset.Detach();
}
catch(_com_error &e)
{
printf("Description = %s\n", (char*) e.Description());
}
catch(...)
{
}
}
return NULL;
}
HRESULT CRADatabase::RAExecuteNoRs(const char *SqlStatement)
{
// Attempt to execute a SQL statement and leave connection open
if (strlen(SqlStatement) > 0)
{
try
{
if (m_Connection == NULL || m_Connection->State == adStateClosed)
RAConnect(m_ConnectionString);
m_Connection->Execute(SqlStatement, NULL, adExecuteNoRecords );
return S_OK;
}
catch(_com_error &e)
{
printf("Description = %s\n", (char*) e.Description());
}
catch(...)
{
}
}
return E_FAIL;
}
_RecordsetPtr CRADatabase::RAExecuteRs(const char *SqlStatement)
{
// Attempt to execute a SQL statement, return the RS, and leave connection open
if (strlen(SqlStatement) > 0)
{
try
{
if (m_Connection == NULL || m_Connection->State == adStateClosed)
RAConnect(m_ConnectionString);
if (m_Recordset)
{
if (m_Recordset->State == adStateOpen)
m_Recordset->Close();
}
else
{
m_Recordset.CreateInstance(__uuidof(Recordset));
}
m_Command->ActiveConnection = m_Connection;
m_Command->CommandType = adCmdText;
m_Command->CommandText = SqlStatement;
_variant_t vNull;
vNull.vt = VT_ERROR;
vNull.scode = DISP_E_PARAMNOTFOUND;
m_Recordset = m_Command->Execute( &vNull, &vNull, adCmdText );
return m_Recordset.Detach();
}
catch(_com_error &e)
{
printf("Description = %s\n", (char*) e.Description());
}
catch(...)
{
}
}
return NULL;
}