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).
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
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;
}
}