pdo odbc sybase freetds sqlanywhere

pdo - DSN apropiado para conectarse a Sybase usando DOP



odbc freetds (1)


Intento conectarme a una base de datos Sybase (SQL Anywhere 12) utilizando el PDO de PHP. Pasé horas tratando de encontrar el controlador correcto y DSN para usar, sin éxito en absoluto. Cada vez que intento editar un solo parámetro siempre obtengo errores. Probé decenas de combinaciones diferentes de parámetros DSN, no pasa nada. Informaré aquí solo unos pocos para darles un ejemplo de lo que estoy tratando de obtener.

Instalé con éxito los controladores PDO desde php.ini:

PDO drivers dblib, mysql, odbc, pgsql PDO Driver for FreeTDS/Sybase DB-lib enabled Flavour freetds

Parámetros de DB:

La IP para el DB es 192.168.100.234 y tanto la instancia db como el nombre db son GAMMA01. No puedo decirte el nombre de usuario y la contraseña, pero digamos: usuario dba y pwd allright.
Puedo hacer ping al servidor desde el servidor donde trato de iniciar la conexión.

Estoy bajo Linux Debian Squeeze y PHP 5.3.3.

DBLIB:

No puedo encontrar el DSN correcto para usar para conectarme a mi servidor de base de datos.

DSN versión 1:

''dblib:host=192.168.100.234;DBN=GAMMA01''

DSN versión 2:

''dblib:host=192.168.100.234;DBN=GAMMA01;UID=dba;PWD=allright;Server=GAMMA01;ASTART=No''

DSN versión 3:

new PDO(''dblib:host=192.168.100.234;dbname=GAMMA01'', ''dba'', ''allright'');

Error que obtengo

SQLSTATE[HY000] Unable to connect: Adaptive Server is unavailable or does not exist (severity 9)

Registro de error FreeTDS (tratando con ambas versiones 5.0 y 7.0, sin diferencia):

log.c:190:Starting log file for FreeTDS 0.82 on 2014-04-08 13:40:40 with debug flags 0x4fff. iconv.c:363:iconv to convert client-side data to the "ANSI_X3.4-1968" character set iconv.c:516:tds_iconv_info_init: converting "US-ASCII"->"UCS-2LE" iconv.c:516:tds_iconv_info_init: converting "ISO-8859-1"->"UCS-2LE" net.c:210:Connecting to 192.168.100.234 port 5200 (TDS version 7.0) net.c:264:tds_open_socket: connect(2) returned "Operation now in progress" net.c:299:getsockopt(2) reported: Connection refused util.c:334:tdserror(0xb9a46eb0, 0xb9b60688, 20009, 115) dblib.c:7782:dbperror(0xb9b5ff88, 20009, 115) dblib.c:7835:20009: "Unable to connect: Adaptive Server is unavailable or does not exist" dblib.c:5627:dbgetuserdata(0xb9b5ff88) dblib.c:7856:"Unable to connect: Adaptive Server is unavailable or does not exist", client returns 2 (INT_CANCEL) util.c:368:tdserror: client library returned TDS_INT_CANCEL(2) util.c:389:tdserror: returning TDS_INT_CANCEL(2) net.c:310:tds_open_socket() failed dblib.c:1372:dbclose(0xb9b5ff88) dblib.c:256:dblib_del_connection(0xb5ceea00, 0xb9b60688) mem.c:563:tds_free_all_results() dblib.c:303:dblib_release_tds_ctx(1) dblib.c:5727:dbfreebuf(0xb9b5ff88) dblib.c:718:dbloginfree(0xb9b46588)

Usando sybase: DSN:

''sybase:host=192.168.100.234;dbname=GAMMA01, dba, allright''

Error:

could not find driver

ODBC:
No puedo conectarme con los controladores ODBC. Leí la guía aquí: http://www.sybase.com/files/White_Papers/PHP_SQL_Anywhere.pdf y descargué el paquete .so apropiado aquí: http://scn.sap.com/docs/DOC-40537 pero puedo Haga que PHP reconozca el paquete, cárguelo y úselo.

DSN:

''odbc:Driver={Sybase SQL Anywhere 12};NA=192.168.100.234,5200;Uid=dba;Pwd=allright;'' ''odbc:Driver={SQL Anywhere 12};NA=192.168.100.234,5200;Uid=dba;Pwd=allright;'' ''odbc:DRIVER={Sybase SQL Anywhere 12};SRVR=192.168.100.234;DB=gamma01;UID=dba;PWD=allright;'' ''odbc:DRIVER={Sybase SQL Anywhere 12};HOSTNAME=192.168.100.234;DATABASE=gamma01;UID=dba;PWD=allright;PROTOCOL:TCPIP''

Error que consigo:

SQLSTATE[IM002] SQLDriverConnect: 0 [unixODBC][Driver Manager]Data source name not found, and no default driver specified

¿Qué controlador debería usar para conectarme a Sybase db? ¿Cuál es el DSN correcto?


El "Data source name not found and no default driver specified." error significa que el DSN o el controlador que está especificando no se pueden encontrar en el archivo odbc.ini para su entorno ODBC.

Debe asegurarse de que su entorno ODBC esté configurado correctamente. Normalmente, esto incluye una especificación para la ubicación y el nombre del archivo odbc.ini .

Al intentar conectarse, se buscará el archivo odbc.ini para encontrar un nombre de fuente de datos (DSN) coincidente.

En su caso, está especificando un "Conductor". Esta es una configuración similar que generalmente se encuentra en el archivo odbcinst.ini ; también especificado por su entorno ODBC.

Otra cosa que debe verificar es asegurarse de que el proceso en ejecución o el usuario propietario de su aplicación PHP encuentre el entorno ODBC.

La clave es averiguar qué parte de la secuencia de conexión está fallando. En su caso, una conexión exitosa seguiría este camino:

  1. La aplicación se inició
  2. Se intenta la conexión ODBC
  3. El entorno ODBC se busca para encontrar el archivo de configuración (generalmente odbcinst.ini para las configuraciones de "Driver")
  4. Busca una coincidencia para el valor especificado para "Driver =" en la cadena de conexión
  5. La conexión se intenta utilizando los valores configurados en la sección Controlador encontrado junto con otras opciones proporcionadas en la cadena de conexión.

Las dos cosas principales que causan el error que está obteniendo son estas:

  1. El entorno ODBC no está configurado
  2. El valor DSN o Driver no está escrito correctamente.

Espero que esto ayude.

Tony Hall