ODBC - UnixODBC

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

ODBC - UnixODBC

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

}

User avatar
evstevemd
Part Of The Furniture
Part Of The Furniture
Posts: 2408
Joined: Wed Jan 28, 2009 11:57 am
Location: United Republic of Tanzania

Re: ODBC - UnixODBC

Post 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!
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?
maxbld
Earned some good credits
Earned some good credits
Posts: 113
Joined: Wed Jan 30, 2013 10:49 pm

Re: ODBC - UnixODBC

Post by maxbld »

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

BR,
Max.
Post Reply