Click here to Skip to main content
15,861,340 members
Articles / Database Development / SQL Server

Another Simple ADO Class

Rate me:
Please Sign up or sign in to vote.
4.61/5 (17 votes)
13 Mar 2001CPOL 121.7K   2.5K   43   8
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

C++
	_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!):

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

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
Questionhow about record set that is not using any database? Pin
novice5128-Feb-11 23:53
novice5128-Feb-11 23:53 
Generalvc project Pin
sarwatyounis12-Dec-04 19:37
sarwatyounis12-Dec-04 19:37 
GeneralFew questions Pin
Jónas Sig19-May-03 21:45
Jónas Sig19-May-03 21:45 
GeneralBAD Memory Leak!! Pin
Striker925-Oct-02 7:00
Striker925-Oct-02 7:00 
GeneralRe: BAD Memory Leak!! Pin
Striker920-Nov-02 7:18
Striker920-Nov-02 7:18 
GeneralDoes this bug in CRADatabase::RAExecuteRs() ? Pin
Echo Yuan21-Aug-03 22:44
Echo Yuan21-Aug-03 22:44 
QuestionHow about Binary Pin
25-Mar-01 4:23
suss25-Mar-01 4:23 
AnswerRe: How about Binary Pin
Jose Cruz21-Nov-02 7:56
Jose Cruz21-Nov-02 7:56 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.