Click here to Skip to main content
Click here to Skip to main content

Simple ODBC Wrapper

, 2 Jul 2004
Rate this:
Please Sign up or sign in to vote.
Simple ODBC Wrapper + Connection classes for several database types.

Introduction

Actually, there's nothing much to say. This article provides you a simple minimal wrapper for ODBC API. The classes have functions that speak for themselves and the name defines the functionality. You should be aware of the basics in ODBC development. If you aren't, there are several articles here that give a great background. I did not intend to teach you, I just wanted to make things easy as I always do (my previous article).

The namespace ODBC

namespace ODBC
{
 #include <sql.h> 
 #include <sqlext.h>
 #include <odbcinst.h>
 //--
 #pragma comment(lib,"odbc32.lib")
 #pragma comment(lib,"odbcbcp.lib")
 #pragma comment(lib,"OdbcCP32.Lib")
 //--
 #define IS_SQL_ERR !IS_SQL_OK
 #define IS_SQL_OK(res) (res==SQL_SUCCESS_WITH_INFO || res==SQL_SUCCESS)
 #define SAFE_STR(str) ((str==NULL) ? _T("") : str)
 //--
 enum sqlDataTypes
 {
  sqlDataTypeUnknown=SQL_UNKNOWN_TYPE,
  sqlDataTypeChar=SQL_CHAR,
  sqlDataTypeNumeric=SQL_NUMERIC,
  sqlDataTypeDecimal=SQL_DECIMAL,
  sqlDataTypeInteger=SQL_INTEGER,
  sqlDataTypeSmallInt=SQL_SMALLINT,
  sqlDataTypeFloat=SQL_FLOAT,
  sqlDataTypeReal=SQL_REAL,
  sqlDataTypeDouble=SQL_DOUBLE,
#if (ODBCVER >= 0x0300)
  sqlDataTypeDateTime=SQL_DATETIME,
#endif
  sqlDataTypeVarChar=SQL_VARCHAR
 };
 //--
 class DSNConnection
 {
 public:
  bool Connect( LPCTSTR svSource ,LPCTSTR szUsername, LPCTSTR szPassword)
  {
   int nConnect = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_hEnv );
   if( nConnect == SQL_SUCCESS || nConnect == SQL_SUCCESS_WITH_INFO ) {
    nConnect = SQLSetEnvAttr( m_hEnv, 
                 SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0 );
    if( nConnect == SQL_SUCCESS || nConnect == SQL_SUCCESS_WITH_INFO ) {
     nConnect = SQLAllocHandle( SQL_HANDLE_DBC, m_hEnv, &m_hDBC );
     if( nConnect == SQL_SUCCESS || nConnect == SQL_SUCCESS_WITH_INFO ) {
      SQLSetConnectOption( m_hDBC,SQL_LOGIN_TIMEOUT,5 );                
      nConnect=SQLConnect( m_hDBC,
         ( SQLTCHAR *)svSource,
         SQL_NTS, 
         ( SQLTCHAR *)szUsername,
         SQL_NTS,
         ( SQLTCHAR *)szPassword,
         SQL_NTS );
      if( nConnect == SQL_SUCCESS || nConnect == SQL_SUCCESS_WITH_INFO )
      {
       return 1;
      }
     }
    }
   }
   if( m_hDBC != NULL ) {
    m_nReturn = SQLDisconnect( m_hDBC );
    m_nReturn = SQLFreeHandle( SQL_HANDLE_DBC,  m_hDBC );
   }
   if( m_hEnv!=NULL )
    m_nReturn = SQLFreeHandle( SQL_HANDLE_ENV, m_hEnv );
   m_hDBC              = NULL;
   m_hEnv              = NULL;
   m_nReturn           = SQL_ERROR;
   return 0;
  }
  DSNConnection()
  {
   m_hDBC              = NULL;
   m_hEnv              = NULL;
   m_nReturn           = SQL_ERROR;
  }
  virtual ~DSNConnection()
  {
   if( m_hDBC != NULL ) {
    m_nReturn = SQLFreeHandle( SQL_HANDLE_DBC,  m_hDBC );
   }
   if( m_hEnv!=NULL )
    m_nReturn = SQLFreeHandle( SQL_HANDLE_ENV, m_hEnv );
  }
  void Disconnect()
  {
   if( m_hDBC != NULL )
   {
    m_nReturn = SQLDisconnect( m_hDBC );
    m_hDBC = NULL;
   }
  }
 public:
  operator HDBC()
  {
   return m_hDBC;
  }
 private:
  SQLRETURN       m_nReturn;      // Internal SQL Error code
  HENV            m_hEnv;         // Handle to environment
  HDBC            m_hDBC;         // Handle to database connection
 };
 //--
 class ODBCConnection
 {
 public:
  bool Connect(LPCTSTR svSource)
  {
   int nConnect = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_hEnv );
   if( nConnect == SQL_SUCCESS || nConnect == SQL_SUCCESS_WITH_INFO ) {
    nConnect = SQLSetEnvAttr( m_hEnv, 
                      SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0 );
    if( nConnect == SQL_SUCCESS || nConnect == SQL_SUCCESS_WITH_INFO ) {
     nConnect = SQLAllocHandle( SQL_HANDLE_DBC, m_hEnv, &m_hDBC );
     if( nConnect == SQL_SUCCESS || nConnect == SQL_SUCCESS_WITH_INFO ) {
      SQLSetConnectOption( m_hDBC,SQL_LOGIN_TIMEOUT,5 );                
      short shortResult = 0;
      SQLTCHAR szOutConnectString[ 1024 ];
      nConnect = SQLDriverConnect( m_hDBC,                // Connection Handle
          NULL,                           // Window Handle
          (SQLTCHAR*)svSource,  // InConnectionString
          _tcslen(svSource),             // StringLength1
          szOutConnectString,             // OutConnectionString
          sizeof( szOutConnectString ),   // Buffer length
          &shortResult,                   // StringLength2Ptr
          SQL_DRIVER_NOPROMPT );          // no User prompt
      return IS_SQL_OK(nConnect);
     }
    }
   }
   if( m_hDBC != NULL ) {
    m_nReturn = SQLDisconnect( m_hDBC );
    m_nReturn = SQLFreeHandle( SQL_HANDLE_DBC,  m_hDBC );
   }
   if( m_hEnv!=NULL )
    m_nReturn = SQLFreeHandle( SQL_HANDLE_ENV, m_hEnv );
   m_hDBC              = NULL;
   m_hEnv              = NULL;
   m_nReturn           = SQL_ERROR;
   return( IS_SQL_OK(nConnect) );
  }
  ODBCConnection()
  {
   m_hDBC              = NULL;
   m_hEnv              = NULL;
   m_nReturn           = SQL_ERROR;
  }
  virtual ~ODBCConnection()
  {
   if( m_hDBC != NULL ) {
    m_nReturn = SQLFreeHandle( SQL_HANDLE_DBC,  m_hDBC );
   }
   if( m_hEnv!=NULL )
    m_nReturn = SQLFreeHandle( SQL_HANDLE_ENV, m_hEnv );
  }
  void Disconnect()
  {
   if( m_hDBC != NULL )
   {
    m_nReturn = SQLDisconnect( m_hDBC );
    m_hDBC = NULL;
   }
  }
 public:
  operator HDBC()
  {
   return m_hDBC;
  }
 private:
  SQLRETURN       m_nReturn;      // Internal SQL Error code
  HENV            m_hEnv;         // Handle to environment
  HDBC            m_hDBC;         // Handle to database connection
 };
 //--
 class MSSQLConnection : public ODBCConnection
 {
 public:
  enum enumProtocols
  {
   protoNamedPipes,
   protoWinSock,
   protoIPX,
   protoBanyan,
   protoRPC
  };
 public:
  MSSQLConnection (){};
  virtual ~MSSQLConnection (){};
  BOOL Connect(LPCTSTR User=_T(""),LPCTSTR Pass=_T(""), 
         LPCTSTR Host=_T("(local)"),BOOL Trusted=1, 
         enumProtocols Proto=protoNamedPipes)
  {
   TCHAR str[512]=_T("");
   _stprintf(str,
     _T("Driver={SQL Server};Server=%s;Uid=%s;Pwd=%s;
     Trusted_Connection=%s;Network=%s;"),
    SAFE_STR(Host),SAFE_STR(User),SAFE_STR(Pass),
                   (Trusted ? _T("Yes") : _T("No")));
   switch(Proto)
   {
   case protoNamedPipes:
    _tcscat(str,_T("dbnmpntw"));
    break;
   case protoWinSock:
    _tcscat(str,_T("dbmssocn"));
    break;
   case protoIPX:
    _tcscat(str,_T("dbmsspxn"));
    break;
   case protoBanyan:
    _tcscat(str,_T("dbmsvinn"));
    break;
   case protoRPC:
    _tcscat(str,_T("dbmsrpcn"));
    break;
   default:
    _tcscat(str,_T("dbmssocn"));
    break;
   }
   _tcscat(str,_T(";"));
   return ODBCConnection::Connect(str);
  };
 };
 //--
 class DB2Connection : private ODBCConnection
 {
 public:
  DB2Connection(){};
  virtual ~DB2Connection(){};
  int Connect(LPCTSTR DBPath)
  {
   TCHAR str[512]=_T("");
   _stprintf(str,_T("Driver={Microsoft dBASE Driver 
          (*.dbf)};DriverID=277;Dbq=%s;"),SAFE_STR(DBPath));
   return ODBCConnection::Connect(str);
  };
 };
 //--
 class XLSConnection : private ODBCConnection
 {
 public:
  XLSConnection(){};
  virtual ~XLSConnection(){};
  int Connect(LPCTSTR XLSPath,LPCTSTR DefDir=_T(""))
  {
   TCHAR str[512]=_T("");
   _stprintf(str,_T("Driver={Microsoft Excel Driver 
         (*.xls)};DriverId=790;bq=%s;DefaultDir=%s;"),
         SAFE_STR(XLSPath),SAFE_STR(DefDir));
   return ODBCConnection::Connect(str);
  };
 };
 //--
 class TXTConnection : private ODBCConnection
 {
 public:
  TXTConnection(){};
  int Connect(LPCTSTR TXTPath)
  {
   TCHAR str[512]=_T("");
   _stprintf(str,_T("Driver={Microsoft Text Driver 
          (*.txt; *.csv)};Dbq=%s;Extensions=asc,csv,tab,txt;"),
          SAFE_STR(TXTPath));
   return ODBCConnection::Connect(str);
  };
 };
 //--
 class FOXConnection : public ODBCConnection
 {
 public:
  FOXConnection(){};
  virtual ~FOXConnection(){};
  int Connect(LPCTSTR DBPath,LPCTSTR User=_T(""),
          LPCTSTR Pass=_T(""),LPCTSTR Type=_T("DBF"),
          BOOL Exclusive=0)
  {
   TCHAR str[512]=_T("");
   _stprintf(str,_T("Driver={Microsoft Visual Foxpro Driver};
          Uid=%s;Pwd=%s;SourceDB=%s;SourceType=%s;Exclusive=%s;"),
          SAFE_STR(User),SAFE_STR(Pass),
          SAFE_STR(DBPath),
          SAFE_STR(Type),(Exclusive ? _T("yes") : _T("no")));
   return ODBCConnection::Connect(str);
  };
 };
 //--
 class MDBConnection : public ODBCConnection
 {
 public:
  MDBConnection(){};
  virtual ~MDBConnection(){};
  int Connect(LPCTSTR MDBPath,LPCTSTR User=_T(""),
            LPCTSTR Pass=_T(""),BOOL Exclusive=0)
  {
   TCHAR str[512]=_T("");
   _stprintf(
    _T("Driver={Microsoft Access Driver (*.mdb)};
               Dbq=%s;Uid=%s;Pwd=%s;Exclusive=%s;"),
               SAFE_STR(MDBPath),SAFE_STR(User),
               SAFE_STR(Pass),(Exclusive ? _T("yes") : _T("no")));
   return ODBCConnection::Connect(str);
  };
 };
 //--
 class mySQLConnection : public ODBCConnection
 {
 public:
  mySQLConnection(){};
  virtual ~mySQLConnection(){};
  int Connect(LPCTSTR User=_T(""),LPCTSTR Pass=_T(""),
         LPCTSTR Host=_T("localhost"),
         UINT Port=3306,UINT Option=0)
  {
   TCHAR str[512]=_T("");
   _stprintf(str,_T("Driver={MySQL ODBC 3.51 Driver};
         Uid=%s;Pwd=%s;Server=%s;Port=%d;"),
         SAFE_STR(User),SAFE_STR(Pass),
         SAFE_STR(Host),Port);
   return ODBCConnection::Connect(str);
  };
  int ConnectDB(LPCTSTR DB,LPCTSTR User=_T(""),
        LPCTSTR Pass=_T(""),LPCTSTR Host=_T("localhost"),
        UINT Port=3306,UINT Option=0)
  {
   TCHAR str[512]=_T("");
   _stprintf(str,_T("Driver={MySQL ODBC 3.51 Driver};
        Database=%s;Uid=%s;Pwd=%s;Server=%s;Port=%d;"),
        SAFE_STR(DB),SAFE_STR(User),SAFE_STR(Pass),
        SAFE_STR(Host),Port);
   return ODBCConnection::Connect(str);
  };
 };
 //--
 class ODBCStmt
 {
  HSTMT m_hStmt;
 public:
  operator HSTMT()
  {
   return m_hStmt;
  }
  ODBCStmt(HDBC hDBCLink)
  {
   SQLRETURN m_nReturn;
   m_nReturn = SQLAllocHandle( SQL_HANDLE_STMT, hDBCLink, &m_hStmt );
   SQLSetStmtAttr(m_hStmt, SQL_ATTR_CONCURRENCY, 
                       (SQLPOINTER) SQL_CONCUR_ROWVER, 0);
   SQLSetStmtAttr(m_hStmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) 
                             SQL_CURSOR_KEYSET_DRIVEN, 0);
   if(!IS_SQL_OK(m_nReturn))
    m_hStmt=INVALID_HANDLE_VALUE;
  }
  virtual ~ODBCStmt()
  {
   if(m_hStmt!=INVALID_HANDLE_VALUE)
    SQLFreeHandle(SQL_HANDLE_STMT,m_hStmt);
  }
  BOOL IsValid()
  {
    return m_hStmt!=INVALID_HANDLE_VALUE;
  }
  USHORT GetColumnCount()
  {
   short nCols=0;
   if(!IS_SQL_OK(SQLNumResultCols(m_hStmt,&nCols)))
    return 0;
   return nCols;
  }
  DWORD GetChangedRowCount(void)
  {
   long nRows=0;
   if(!IS_SQL_OK(SQLRowCount(m_hStmt,&nRows)))
    return 0;
   return nRows;
  }
  BOOL Query( LPCTSTR strSQL)
  {
   SQLRETURN nRet=SQLExecDirect( m_hStmt, (SQLTCHAR *)strSQL, SQL_NTS );
   return IS_SQL_OK( nRet );
  }
  BOOL Fetch()
  {
   SQLRETURN nRet=SQLFetch(m_hStmt);
   return IS_SQL_OK( nRet );
  }
  BOOL FecthRow(UINT nRow)
  {
   return IS_SQL_OK(SQLSetPos(m_hStmt, nRow, SQL_POSITION, SQL_LOCK_NO_CHANGE));
  }
  BOOL FetchPrevious()
  {
   SQLRETURN nRet=SQLFetchScroll(m_hStmt,SQL_FETCH_PRIOR,0);
   return IS_SQL_OK(nRet);
  }
  BOOL FecthNext()
  {
   SQLRETURN nRet=SQLFetchScroll(m_hStmt,SQL_FETCH_NEXT,0);
   return IS_SQL_OK(nRet);
  }
  BOOL FetchRow(ULONG nRow,BOOL Absolute=1)
  {
   SQLRETURN nRet=SQLFetchScroll(m_hStmt,
      (Absolute ? SQL_FETCH_ABSOLUTE : SQL_FETCH_RELATIVE),nRow);
   return IS_SQL_OK(nRet);
  }
  BOOL FetchFirst()
  {
   SQLRETURN nRet=SQLFetchScroll(m_hStmt,SQL_FETCH_FIRST,0);
   return IS_SQL_OK(nRet);
  }
  BOOL FetchLast()
  {
   SQLRETURN nRet=SQLFetchScroll(m_hStmt,SQL_FETCH_LAST,0);
   return IS_SQL_OK(nRet);
  }
  BOOL Cancel()
  {
   SQLRETURN nRet=SQLCancel(m_hStmt);
   return IS_SQL_OK(nRet);
  }
 };
 //--
 class ODBCRecord
 {
  HSTMT m_hStmt;
 public:
  ODBCRecord(HSTMT hStmt){m_hStmt=hStmt;};
  ~ODBCRecord(){};
  USHORT GetColumnCount()
  {
   short nCols=0;
   if(!IS_SQL_OK(SQLNumResultCols(m_hStmt,&nCols)))
    return 0;
   return nCols;
  }
  BOOL BindColumn(USHORT Column,LPVOID pBuffer,
        ULONG pBufferSize,LONG * pReturnedBufferSize=NULL,
        USHORT nType=SQL_C_TCHAR)
  {
   LONG pReturnedSize=0;
   SQLRETURN Ret=SQLBindCol(m_hStmt,Column,nType,
               pBuffer,pBufferSize,&pReturnedSize);
   if(*pReturnedBufferSize)
    *pReturnedBufferSize=pReturnedSize;
   return IS_SQL_OK(Ret);
  }
  USHORT GetColumnByName(LPCTSTR Column)
  {
   SHORT nCols=GetColumnCount();
   for(USHORT i=1;i<(nCols+1);i++)
   {
    TCHAR Name[256]=_T("");
    GetColumnName(i,Name,sizeof(Name));
    if(!_tcsicmp(Name,Column))
     return i;
   }
   return 0;
  }
  BOOL GetData(USHORT Column, LPVOID pBuffer, 
    ULONG pBufLen, LONG * dataLen=NULL, int Type=SQL_C_DEFAULT)
  {
   SQLINTEGER od=0;
   int Err=SQLGetData(m_hStmt,Column,Type,pBuffer,pBufLen,&od);
   if(IS_SQL_ERR(Err))
   { 
    return 0;
   } 
   if(dataLen)
    *dataLen=od;
   return 1;
  }
  int GetColumnType( USHORT Column )
  {
   int nType=SQL_C_DEFAULT;
   SQLTCHAR svColName[ 256 ]=_T("");
   SWORD swCol=0,swType=0,swScale=0,swNull=0;
   UDWORD pcbColDef;
   SQLDescribeCol( m_hStmt,            // Statement handle
       Column,             // ColumnNumber
       svColName,          // ColumnName
       sizeof( svColName), // BufferLength
       &swCol,             // NameLengthPtr
       &swType,            // DataTypePtr
       &pcbColDef,         // ColumnSizePtr
       &swScale,           // DecimalDigitsPtr
       &swNull );          // NullablePtr
   nType=(int)swType;
   return( nType );
  }
  DWORD GetColumnSize( USHORT Column )
  {
   int nType=SQL_C_DEFAULT;
   SQLTCHAR svColName[ 256 ]=_T("");
   SWORD swCol=0,swType=0,swScale=0,swNull=0;
   DWORD pcbColDef=0;
   SQLDescribeCol( m_hStmt,            // Statement handle
       Column,             // ColumnNumber
       svColName,          // ColumnName
       sizeof( svColName), // BufferLength
       &swCol,             // NameLengthPtr
       &swType,            // DataTypePtr
       &pcbColDef,         // ColumnSizePtr
       &swScale,           // DecimalDigitsPtr
       &swNull );          // NullablePtr
   return pcbColDef;
  }
  DWORD GetColumnScale( USHORT Column )
  {
   int nType=SQL_C_DEFAULT;
   SQLTCHAR svColName[ 256 ]=_T("");
   SWORD swCol=0,swType=0,swScale=0,swNull=0;
   DWORD pcbColDef=0;
   SQLDescribeCol( m_hStmt,            // Statement handle
       Column,             // ColumnNumber
       svColName,          // ColumnName
       sizeof( svColName), // BufferLength
       &swCol,             // NameLengthPtr
       &swType,            // DataTypePtr
       &pcbColDef,         // ColumnSizePtr
       &swScale,           // DecimalDigitsPtr
       &swNull );          // NullablePtr
   return swScale;
  }
  BOOL GetColumnName( USHORT Column, LPTSTR Name, SHORT NameLen )
  {
   int nType=SQL_C_DEFAULT;
   SWORD swCol=0,swType=0,swScale=0,swNull=0;
   DWORD pcbColDef=0;
   SQLRETURN Ret=
    SQLDescribeCol( m_hStmt,            // Statement handle
       Column,               // ColumnNumber
       (SQLTCHAR*)Name,     // ColumnName
       NameLen,    // BufferLength
       &swCol,             // NameLengthPtr
       &swType,            // DataTypePtr
       &pcbColDef,         // ColumnSizePtr
       &swScale,           // DecimalDigitsPtr
       &swNull );          // NullablePtr
   if(IS_SQL_ERR(Ret))
    return 0;
   return 1;
  }
  BOOL IsColumnNullable( USHORT Column )
  {
   int nType=SQL_C_DEFAULT;
   SQLTCHAR svColName[ 256 ]=_T("");
   SWORD swCol=0,swType=0,swScale=0,swNull=0;
   UDWORD pcbColDef;
   SQLDescribeCol( m_hStmt,            // Statement handle
       Column,             // ColumnNumber
       svColName,          // ColumnName
       sizeof( svColName), // BufferLength
       &swCol,             // NameLengthPtr
       &swType,            // DataTypePtr
       &pcbColDef,         // ColumnSizePtr
       &swScale,           // DecimalDigitsPtr
       &swNull );          // NullablePtr
   return (swNull==SQL_NULLABLE);
  }
 };
};

What does it consist of?

This demo is a namespace with several classes.

  • ODBCConnection - base class for the others.
  • MSSQLConnection - base class for MSSQL Server connection.
  • MDBConnection - base class for Access connection.
  • DSNConnection - base class for DSN connection.
  • FOXConnection - base class for FOXPRO connection.
  • MySQLConnection - base class for MySQL connection. You need the myODBC driver installed.
  • XLSConnection - base class for Excel connection.
  • ODBCStmt - base class for SQL statement. Functions are self-explainable.
  • ODBCRecord - base class for actions taken on current record. Functions are self-explainable.

1st Example

How to parse Customers from the NorthWind database in SQL Server 2000:

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
//make sure you include the namespace
using namespace ODBC;

int main(void)
{
 MSSQLConnection link;
 if(link.Connect())
 {
  ODBCStmt Stmt(link);
  SQLExecDirect(Stmt,(SQLTCHAR*)_T("USE NorthWind"),SQL_NTS);
  int pos=1;
  TCHAR strQuery[256]=_T("SELECT * FROM [Customers]");
  int nRet=Stmt.Query(strQuery);
  printf("%5d:\tColumns\t%d\r\n\r\n",Stmt.GetColumnCount(),0);
  while(Stmt.Fetch())
  {
   ODBCRecord rec(Stmt);
   printf("Row %5d\r\n",pos);
   INT i=0;
   while(i<Stmt.GetColumnCount())
   {
    TCHAR Desc[512]=_T("");SQLINTEGER cbDesc=0;
    rec.GetData(i+1,Desc,sizeof(Desc),&cbDesc);
    TCHAR Name[256]=_T("");
    rec.GetColumnName(i+1,Name,sizeof(Name));
    i++;
    printf("\t%15s\t\\>\t%25s\r\n",Name,Desc);
   }
   pos++;
  };
 }
 link.Disconnect();
 getch();
 return 0;
}

2nd Example

How to parse Customers from the NorthWind database in SQL Server 2000 in reverse order:

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
//make sure you include the namespace
using namespace ODBC;

int main(void)
{
 MSSQLConnection link;
 if(link.Connect())
 {
  ODBCStmt Stmt(link);
  SQLExecDirect(Stmt,(SQLTCHAR*)_T("USE NorthWind"),SQL_NTS);
  int pos=1;
  TCHAR strQuery[256]=_T("SELECT * FROM [Customers]");
  int nRet=Stmt.Query(strQuery);
  printf("%5d:\tColumns\t%d\r\n\r\n",Stmt.GetColumnCount(),0);
Stmt.FetchLast();
  do
  {
   ODBCRecord rec(Stmt);
   printf("Row %5d\r\n",pos);
   INT i=0;
   while(i<Stmt.GetColumnCount())
   {
    TCHAR Desc[512]=_T("");SQLINTEGER cbDesc=0;
    rec.GetData(i+1,Desc,sizeof(Desc),&cbDesc);
    TCHAR Name[256]=_T("");
    rec.GetColumnName(i+1,Name,sizeof(Name));
    i++;
    printf("\t%15s\t\\>\t%25s\r\n",Name,Desc);
   }
   pos++;
  }while(Stmt.FetchPrevious());
 }
 link.Disconnect();
 getch();
 return 0;
}

In the end ...

These classes will certainly ease your life. They don't do everything but they do what is required to have a starting point. If you like rate it Smile | :) [less than 5 is unacceptable].

Be cool.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

TomKat
Web Developer
Romania Romania
I have been programming for the past 6 years in VBasic, Delphi, C, C++ .
I also have extended knowledge of webdesign (HTML, CSS, JavaScript, VBScript), webprogramming (PHP, ASP, ASP.NET (C#)) and database integration (mySql, MSSQL Server).
And when I`m not programming I`m working out or working on some personal projects .
Last but not least I`m looking for a project-based job in programming or webdesign .

Comments and Discussions

 
GeneralMy vote of 5 Pinmemberdodohu24-Dec-12 6:20 
GeneralMy vote of 4 PinmemberPhantomJ27-Aug-12 5:15 
GeneralCopyright PinmemberMichael L. Boom1-Mar-09 17:10 
QuestionTrouble retrieving numeric data instead of character data PinmemberMember 310445120-Dec-08 6:54 
Generalcannot connect to excel using XLSConnection Pinmembergab24-Dec-07 10:09 
Generaldo not wait for response PinmemberItamar Avraham29-May-07 21:40 
GeneralI think that you have a bug [modified] Pinmemberenav6-Dec-06 23:20 
GeneralODBC wrapper for excel Read/Write [modified] Pinmemberbenag4-Jul-06 0:41 
Questionhelp!! How I count all rows of the table using SQL a statement PinmemberJorge2227-Feb-06 18:58 
AnswerRe: help!! How I count all rows of the table using SQL a statement PinmemberMike C#16-Jun-06 4:50 
Generalanother library to work with databases Pinmembersancho705-Dec-05 6:09 
QuestionIs it a bug? Pinmemberhoho00018-Oct-05 5:21 
Generalmany threads PinsussNeKiTu5-Sep-05 15:35 
GeneralExamples for INSERT, DELETE etc. PinmemberAndy_4418-May-05 5:48 
GeneralRe: Examples for INSERT, DELETE etc. Pinmemberuibwiiweuibwuibewuibewuibew7-Jul-05 13:57 
QuestionPostgreSQL? PinmemberAndy_4417-May-05 5:35 
Generalmdi odbc PinsussAnonymous11-May-05 4:02 
QuestionError in the code? PinmemberSuperJeff24-Mar-05 13:23 
AnswerRe: Error in the code? PinsussIBone©24-Mar-05 21:33 
QuestionHow to use? PinmemberNarusegawa12-Oct-04 6:23 
AnswerRe: How to use? PinmemberTomKat12-Oct-04 11:06 
GeneralRe: How to use? PinmemberNarusegawa13-Oct-04 0:12 
GeneralRe: How to use? PinmemberTomKat13-Oct-04 2:03 
GeneralI can`t upload a file . PinmemberTomKat3-Jul-04 8:53 
GeneralRe: I can`t upload a file . PinmemberTomKat3-Jul-04 9:10 

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

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

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.141216.1 | Last Updated 3 Jul 2004
Article Copyright 2004 by TomKat
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid