65.9K
CodeProject is changing. Read more.
Home

Another Simple ADO Class

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.61/5 (15 votes)

Jan 31, 2001

CPOL
viewsIcon

122483

downloadIcon

2536

Another simple yet cool ADO class for your project - from zCoders.com

Sample Image - logo-tm.gif

Introduction

Here is another ADO class for any database projects you may have coming up. The class is provided from the link above. The class is zipped up with the ADO type library. I created this class because I couldn't find any good ADO classes with disconnected recordsets in them. I hope this class helps you out.

Here are the main methods:

  • CRADatabase()
  • ~CRADatabase()
  • RAConnect(char *ConnectionString)
  • RAGetDisconnectedRs(char *SqlStatement)
  • RAExecuteNoRs(char *SqlStatement)
  • RAExecuteRs(char *SqlStatement)

Usage

	_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();
			}			
		}
}

Here is the code (click on the link above to get zipped class!):

// 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;
}