Scenario di partenza#
- Attraverso la CLP di IBM DB2 o di un tool come Toad For DB2, dopo aver catalogato correttamente il database, riesco a connettermi correttamente.
CATALOG TCPIP NODE TEST REMOTE 192.168.0.1 SERVER 50000 REMOTE_INSTANCE DB2 OSTYPE LINUX
CATALOG DATABASE TEST_DB AS TEST_DB AT NODE TEST
CONNECT TO TEST USER db2admin USING db2admin
- Attraverso PHP PDO ODBC tento di connettermi al database:
$conn = new PDO('odbc:Driver=IBM DB2 ODBC DRIVER - DB2COPY1;Hostname=192.168.0.1;Port=50000;Database=TEST_DB;Protocol=TCPIP;Uid=db2admin;Pwd=db2admin;','db2admin','db2admin');
- La connessione fallisce e nell'error log del PHP viene riportato il seguente messaggio di errore:
SQLSTATE[HY000] SQLDriverConnect: -1042 [IBM][CLI Driver] SQL1042C Errore di sistema non previsto. SQLSTATE=58004
Analisi del problema#
Leggendo la documentazione del DB2 non si riesce a capire con precisione la causa del problema visto che si tratta di un errore generico.
Approfondisco il problema esaminando il file db2diag.log che, per un'installazione su Windows 10 di DB2 Express-C ver 10.5 a 64 bit si trova nel percorso seguente:
C:\ProgramData\IBM\DB2\DB2COPY1\DB2
In concomitanza con il tentativo di connessione al database, nel db2diag.log, viene riportato il seguente messaggio d'errore:
2016-01-22-18.12.07.981000+060 I540185H511 LEVEL: Error
PID : 7536 TID : 1688 PROC : php-cgi.exe
INSTANCE: DB2 NODE : 000
HOSTNAME: XXXXXXXXXX
EDUID : 1688
FUNCTION: DB2 Common, Cryptography, cryptDynamicLoadGSKitCrypto, probe:998
MESSAGE : ECF=0x90000076=-1879048074=ECF_LIB_CANNOT_LOAD
Cannot load the specified library
DATA #1 : unsigned integer, 4 bytes
70
DATA #2 : String, 42 bytes
C:\PROGRA~1\IBM\SQLLIB\bin\icc\gsk8sys.dll
Da cui si capisce che il problema è che il processo php-cgi.exe (l'interprete PHP utilizzato da Apache) non riesce a caricare la libreria contenuta nel file gsk8sys.dll.
Infatti se vado a vedere nel percorso indicato tale dll non è presente, ma si trova invece nella directory C:\Program Files (x86)\ibm\gsk8\lib.
Soluzione#
Cercando su internet questo problema qualcuno suggeriva di mettere nella variabile d'ambiente PATH il percorso della dll, ma nel mio caso era già presente.
Per risolvere il problema ho dovuto pertanto:
- Creare la directory icc sotto C:\Program Files\IBM\SQLLIB\BIN.
- Copiare il contenuto della directory C:\Program Files (x86)\ibm\gsk8\lib nella directory C:\Program Files\IBM\SQLLIB\BIN\icc.
Spero che questo articolo risparmi qualche ora a chi dovesse incontrare questo tipo di problema.