Se trovi utile il mio blog sostienimi con una piccola donazione. GRAZIE

unixODBC e Microsoft SQL

Come configurare una connessione ODBC su Linux verso un database Microsoft SQL

Per la connessione ai database esistono diverse librerie native per i vari linguaggi di sviluppo ma ogni libreria ha il suo modo di utilizzo ed il metodo più pratico per interagire facilmente con i database , a prescindere da quale di essi si stia utilizzando e senza preoccuparsi di conoscerne profondamente i suoi meccanismi , è ODBC  .

ODBC significa “Open Database Connectivity ” ed è un set di API ben documentate ed implementate per molte piattaforme tra cui Linux con , per esempio ,  unixODBC.

Il sistema operativo sul quale ho basato questo breve tutorial è UBUNTU 12.04 e l’obbiettivo sarà quello di collegarsi ad un DataBase server Microsoft SQL.

Oltre a unixODBC avremo necessità di un driver (odbc) per il datatbase con cui dobbiamo scambiare i dati e nel nostro caso utilizzeremo FreeTDS .

FreeTDS è un driver per comunicare in modo nativo con database Microsoft SQL e SyBase .

Quindi il nostro programma interagirà con unixODB che a sua volta (senza che voi ve ne accorgiate) ‘parlerà’ con il driver che si occuperà di comunicare con il database.

Quindi il vostro programma , anche nel caso doveste cambiare tipo di database , continuerà a parlare solo con unixODBC semplificandovi notevolmente la vita .

I pacchetti che dovremo installare sono quelli sotto riportati :

  • unixodbc
  • unixodbc-bin
  • unixodbc-dev
  • odbc-postgresql
  • libmyodbc
  • freetds-bin
  • freetds-dev
  • tdsodbc

Il pacchetto odbc-postgresql (per Postgres )in realtà non ci servirebbe dovendo comunicare con dabase MS SQL ma la sua installazione farà in modo di compilare automaticamente due sezioni in odbcinst.ini che ci serviranno come esempio.

A questo punto avremo tutto quello che ci serve ovvero unixODBC installato e il driver FreeTDS .

Il pacchetto unixodbc-bin installerà due frontend grafici per la configurazione facilitata .

Il primo si chiama ODBCCreateDataSourceQ4 per configurare i driver e ODBCManagerSourcesQ4 per creare e gestire le connessioni ai database.

Come presupposto considererò di avere MS SQL installato su di una macchina Windows (ovviamente) raggiungibile in rete e che ci sia il database NorthWind (quello di esempio generato di default)  in modo da poter fare qualche prova.

Ora come primo test dovremo provare a connetterci con il DataBase server tramite il programma tsql che viene fornito con la suite freetds.

Quindi all’interno di una shell digiteremo in comando tsql seguito dai parametri di accesso .

[francesco@pc ~]# tsql –S NOME DEL SERVER o IP –p 1433 –U NOME UTENTE WINDOWSSQL –P PASSWORD
locale is “en_US.UTF8″
locale charset is “UTF8″
1>

Se i dati introdotti sono corretti , e ovviamente potete raggiungere il server , dovrebbe presentarsi una videata come quella sopra che indica che siete riusciti a connettervi correttamente.

Nel caso abbiate sbagliato nome utente o password il server vi risponderà con un errore relativo all’utente mentre se non riuscite a parlare con il server vi verrà segnalato , appunto che il server è irraggiungibile.

Al prompt >1 di tsql possiamo anche dare il comando version per verificare quale versione del protocollo freeTDS abbiamo utilizzato per collegarci come riporto sotto :

[francesco@pc ~]# tsql –S NOME DEL SERVER o IP –p 1433 –U NOME UTENTE WINDOWSSQL –P PASSWORD
locale is “en_US.UTF8″
locale charset is “UTF8″
1> version
using TDS version 4.2
1>

Ora dovremo istruire unixODBC ad utilizzare il driver freetds e configurare freetds perché si connetta al DataBase server .

Una parte del lavoro può essere fatto utilizzando un’interfaccia grafica che viene lanciata digitando il seguente comando in un terminale :

[francesco@pc ~]# odbcinst –m

Non vi spiegherò come utilizzare questo tools , che è anche piuttosto intuitivo , perché magari su altre distribuzioni potreste non averlo a disposizione e quindi preferisco farvi vedere come modificare i file di configurazione con un editor (usate quello che vi piace di più).

Il primo passo servirà a configurare unixODBC in modo che possa utilizzare il driver freeTDS compilando il file odbcinst.ini .

Il file è in /etc/ e quello sotto è il mio :

[PostgreSQL ANSI]
Description          = PostgreSQL ODBC driver (ANSI version)
Driver          = psqlodbca.so
Setup     = libodbcpsqlS.so
Debug     = 0
CommLog         = 1
UsageCount      = 1

[PostgreSQL Unicode]
Description          = PostgreSQL ODBC driver (Unicode version)
Driver          = psqlodbcw.so
Setup     = libodbcpsqlS.so
Debug     = 0
CommLog         = 1
UsageCount      = 1

[ms-sql]
Description          = TDS ODBC driver
Driver          = libtdsodbc.o
Setup     = libtdsS.so
Debug     = 0
CommLog         = 1
UsageCount      = 1

[MySQL]
Description = MySQL ODBC driver
Driver = libmyodbc.so
Driver64 =
Setup = libodbcmyS.so
Setup64 =
UsageCount = 1
CPTimeout =
CPTimeToLive =
DisableGetFunctions =
DontDLCLose =
ExFetchMapping =
Threading =
FakeUnicode =
IconvEncoding =
Trace =
TraceFile =
TraceLibrary =
Debug = 0
CommLog = 1

Nella nuova sezione ms-sql , da me creata , viene istruito unixODBC per utilizzare il driver freeTDS.

Il secondo passo servirà a configurare le connessioni di unixODBC compilando il file odbc.ini .

Questo file può esistere in almeno due locazioni :

1 – nella cartella Home dell’utente come file nascosto . Tutte le configurazioni scritte qui saranno valide solo a livello utente

2 – in /etc/ e tutte le configurazioni scritte qui saranno quindi a livello di sistema.

Il mio file odbc.ini è il seguente :

 [odbc-test]
 Description          = ms-sql
 Driver          = ms-sql
 Servername      = ms-sql
 Database        = Northwind
 UID       = utente
 PWD       = password
 Port      = 1433

 [odbc-pr]
 Description          = ms-sql
 Driver          = ms-sql
 Servername      = ms-sql
 Database        = DB_PR
 UID       = utente
 PWD       = password
 Port      = 1433

 [MySQL_Test]
 Description = MySQL
 Driver = MySQL
 Server = 127.0.0.1
 Database = test
 Port = 3306
 Socket =
 Option =
 Stmt =

Come potete vedere in entrambe le sezioni è stato utilizzato come driver quello creato in odbcinst con il nome ms-sql che istruisce unixODBC all’utilizzo di freeTDS.

Quindi ora ho due connessioni chiamate odbc-test e odbc-pr che puntano a due database differenti sullo stesso server.

Ora bisognerà configurare freeTDS in modo che si connetta correttamente al server .

Per farlo dovremo editare il file freeTDS.conf  che è in /etc/freetds/ e quello sotto è il mio :

#   $Id: freetds.conf,v 1.12 2007/12/25 06:02:36 jklowden Exp $
 #
 # This file is installed by FreeTDS if no file by the same
 # name is found in the installation directory.
 #
 # For information about the layout of this file and its settings,
 # see the freetds.conf manpage "man freetds.conf".

 # Global settings are overridden by those in a database
 # server specific section
 [global]
 # TDS protocol version
 ;    tds version = 4.2

 # Whether to write a TDSDUMP file for diagnostic purposes
 # (setting this to /tmp is insecure on a multi-user system)
 ;    dump file = /tmp/freetds.log
 ;    debug flags = 0xffff

 # Command and connection timeouts
 ;    timeout = 10
 ;    connect timeout = 10

 # If you get out-of-memory errors, it may mean that your client
 # is trying to allocate a huge buffer for a TEXT field.
 # Try setting 'text size' to a more reasonable limit
 text size = 64512

 # A typical Sybase server
 [egServer50]
 host = symachine.domain.com
 port = 5000
 tds version = 5.0

 # A typical Microsoft server
 [ms-sql]
 host = nome o IP
 port = 1433
 tds version = 7.0

La sezione che io ho creato è l’ultima e possiamo averne quante vogliamo.

Ora per testare la connessione in un terminale dovremo digitare il seguente comando :

[francesco@pc ~]# isql –v odbc-test utente password
 +---------------------------------------+
 | Connected!                            |
 |                                       |
 | sql-statement                         |
 | help [tablename]                      |
 | quit                                  |
 |                                       |
 +---------------------------------------+
 SQL>

Questo significa che la connessione è andata a buon fine e se al prompt di SQL introdurremo come commando help otterremo la lista delle tabelle .

Può darsi che la formattazione dell’output del comando help non sia molto comprensibile se i nomi delle tabelle sono molto lunghi ma basta copiare il testo che verrà rappresentato nel terminale ed incollarlo in un editor di testo per rendere il tutto comprensibile.

Quello che riporto sotto è un esempio di query SQL :

 +---------------------------------------+
 | Connected!                            |
 |                                       |
 | sql-statement                         |
 | help [tablename]                      |
 | quit                                  |
 |                                       |
 +---------------------------------------+
 SQL> SELECT * FROM Categories
 +------------+----------------+------------------------------------------------------------+
 | CategoryID | CategoryName   | Description                                                |
 +------------+----------------+----------------------------------------------------------- +
 | 1          | Beverages      | Soft drinks, coffees, teas, beers, and ales                |
 | 2          | Condiments     | Sweet and savory sauces, relishes, spreads, and seasonings |
 | 3          | Confections    | Desserts, candies, and sweet breads                        |
 | 4          | Dairy Products | Cheeses                                                    |
 | 5          | Grains/Cereals | Breads, crackers, pasta, and cereal                        |
 | 6          | Meat/Poultry   | Prepared meats                                             |
 | 7          | Produce        | Dried fruit and bean curd                                  |
 | 8          | Seafood        | Seaweed and fish                                           |
 +------------+----------------+------------------------------------------------------------+

 SQLRowCount returns 8
 8 rows fetched
 SQL>