ODBC - UnixODBC

In this forum you can discuss database related issues which can be wxWidgets related, but also generic in nature.
gandalf
Earned a small fee
Earned a small fee
Posts: 13
Joined: Wed Feb 06, 2013 10:33 pm

ODBC - UnixODBC

Postby gandalf » Tue Apr 02, 2013 3:47 pm

Hi all.

I have developed a program (on windows 7) that reads the data to be processed from a Microsoft SQL Database using an ODBC connection.
It works perfectly.
Now I wanted to know if the class that I used on windows can also be used on Linux with unixODBC or if I have to use a specific library.
Thank you for your attention (I am attaching the code below).

Image

Db_SQL.h

Code: Select all

using namespace std;


class DB_SQL
{
    struct ColDescription
   {
      SQLSMALLINT colNumber;
      SQLCHAR colName[80];
      SQLSMALLINT nameLen;
      SQLSMALLINT dataType;
      SQLULEN colSize;
      SQLSMALLINT decimalDigits;
      SQLSMALLINT nullable;
   };
   // Attributes
    public:
        SQLHANDLE EnvHandle;
        SQLHANDLE ConHandle;
        SQLHANDLE StmtHandle;
        SQLRETURN rc;
        vector<ColDescription> cols;
        vector< vector<string> > colData;
    public:
        /** Default constructor */
        DB_SQL();
        /** Default destructor */
        ~DB_SQL();

        SQLRETURN GetResultset();
        void DescribeColumns();

        /** Access m_Counter
         * \return The current value of m_Counter
         */
        unsigned int GetCounter() { return m_Counter; }
        /** Set m_Counter
         * \param val New value to set
         */
        void SetCounter(unsigned int val) { m_Counter = val; }
    protected:
    private:
        inline SQLRETURN Describe(ColDescription& c);
        SQLRETURN GetColData(int colnum, string& str);
        unsigned int m_Counter; //!< Member variable "m_Counter"
};

#endif // DB_SQL_H



DB_SQL.cpp

Code: Select all

/*
+-----------------------------------------------------------------------------+
!         Classe per l'accesso ai database tramite ODBC                       !
+-----------------------------------------------------------------------------+
!         Testata su Windows(odbc)                                            !
+-----------------------------------------------------------------------------+
! Su windows lincare le seguenti librerie :                                   !
!       libodbc32.a                                                           !
!       libodbccp32.a                                                         !
+-----------------------------------------------------------------------------+
! Su linux lincare le seguenti librerie :                                     !
!       libodbc.so                                                            !
!       libodbcinst.so                                                        !
!       libodbccr.so                                                          !
+-----------------------------------------------------------------------------+
!      Francesco Aria                                                         !
!      aria.francesco@gmail.com                                               !
!      www.flussiliberi.it                                                    !
+-----------------------------------------------------------------------------+
*/

#include "DB_SQL.h"

DB_SQL::DB_SQL()
{
    // Inizializzazione della variabile dei codici di riasposta
   rc = SQL_SUCCESS;
   // Allocazione di un Environment Handle
   rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &EnvHandle);
   // Impostazione della Versione di applicazione ODBC a 3.x
   if (rc == SQL_SUCCESS)
      rc = SQLSetEnvAttr(EnvHandle, SQL_ATTR_ODBC_VERSION,
         (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_UINTEGER);
   // Allocazione di un Handle di connessione
   if (rc == SQL_SUCCESS)
      rc = SQLAllocHandle(SQL_HANDLE_DBC, EnvHandle, &ConHandle);
}

DB_SQL::~DB_SQL()
{
   // Distruzione dell'Handle di Connessione
   if (ConHandle != NULL)
      SQLFreeHandle(SQL_HANDLE_DBC, ConHandle);
   // Distruzione dell Environment Handle
   if (EnvHandle != NULL)
      SQLFreeHandle(SQL_HANDLE_ENV, EnvHandle);
}

// Prende i dati di una colonna e ritorna le informazioni nella forma
// di un std::string. Il driver ODBC dovrebbe eseguire tutte le conversioni
// necessarie di qualunque tipo di dato sia all'interno del database
// in SQL_CHAR. Si potrebbe rendere questa funzione più complessa
// prendendo il tipo di dato come appare nel database e costruendo
// un oggetto VARIANT per immagazzinare i dati.
SQLRETURN DB_SQL::GetColData(int colnum, string& str)
{
   SQLCHAR buf[255] = {0};
   if( (rc = SQLGetData(StmtHandle, colnum, SQL_CHAR, buf, sizeof(buf), NULL)) == SQL_SUCCESS)
      str = reinterpret_cast<char*>(buf);
   return rc;
}

//
// Definizione della Funzione membro GetResultset()
SQLRETURN DB_SQL::GetResultset()
{
   // Legge la descrizione di tutte le colonne
   DescribeColumns();
   // cancella tutto quello che c'è nel vettore colData
   colData.clear();
   // estrae una riga (record) dal resultset
   while( SQLFetch(StmtHandle) == SQL_SUCCESS)
   {
      // vettore di strings per memorizzare i dati di colonna
      vector<string> col;
      string data;
      // contatore colonne
      int i = 1;
      // legge i dati di ciascuna colonna e li aggiunge al
      // vettore col
      while( GetColData(i, data) == SQL_SUCCESS)
      {
         col.push_back(data);
         ++i; // incrementa il numero colonna
      }
      // aggiunge i dati di colonna al vettore colData
      colData.push_back(col);
   }
   return SQL_SUCCESS;
}

// Ottiene la descrizione di una colonna dal resultset.
SQLRETURN  DB_SQL::Describe(ColDescription& c)
{
   return SQLDescribeCol(StmtHandle,c.colNumber,
      c.colName, sizeof(c.colName), &c.nameLen,
      &c.dataType, &c.colSize, &c.decimalDigits, &c.nullable);
}

// Ottiene la descrizione di tutte le colonne nel resultset.
void DB_SQL::DescribeColumns()
{
   ColDescription c;
   c.colNumber = 1;
   cols.clear();
   while( Describe(c) == SQL_SUCCESS)
   {
      cols.push_back(c);
      ++c.colNumber;
   }

}


User avatar
evstevemd
Part Of The Furniture
Part Of The Furniture
Posts: 2092
Joined: Wed Jan 28, 2009 11:57 am
Location: Dar es Salaam, United Republic of Tanzania
Contact:

Re: ODBC - UnixODBC

Postby evstevemd » Wed Apr 17, 2013 4:05 pm

AFAIK ODBC is standard that finds implementation as MS ODBC, UnixODBC et al.
So If the library sticks to ODBC standard then Yes else, big No!
Check the manual of relevant libraries for functions!
Chief Justice: We have trouble dear citizens!
Citizens: What it is his honor?
Chief Justice:Our president is an atheist, who will he swear to?
[Ubuntu 15.04/Windows 10 Pro - GCC/MinGW, CodeLite IDE et al]

maxbld
Earned some good credits
Earned some good credits
Posts: 111
Joined: Wed Jan 30, 2013 10:49 pm

Re: ODBC - UnixODBC

Postby maxbld » Fri May 17, 2013 10:10 am

AFAIK unixODBC is sort of discontinued / malfunctioning. You should give iODBC a try.

BR,
Max.


Return to “Database Related”

Who is online

Users browsing this forum: No registered users and 1 guest