Page 1 of 1

ODBC - UnixODBC

Posted: Tue Apr 02, 2013 3:47 pm
by gandalf
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                                                         !
!      [email protected]                                               !
!      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;
	}

}


Re: ODBC - UnixODBC

Posted: Wed Apr 17, 2013 4:05 pm
by evstevemd
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!

Re: ODBC - UnixODBC

Posted: Fri May 17, 2013 10:10 am
by maxbld
AFAIK unixODBC is sort of discontinued / malfunctioning. You should give iODBC a try.

BR,
Max.