jueves, octubre 04, 2007

Conexión: Qt3 y Oracle, ODBC

Aquí les dejo algunos detalles sobre la conexión desde QT3 a Oracle 10g Database Express Edition en la plataforma Linux (distribución: Ubuntu).

En unos datos un poquito más técnicos:

  • Me conecté a través de ODBC, la información más importante está aquí.

  • El driver pueden descargarlo de aquí. Al crear su cuenta en el listado de plataformas elijan: Linux-x86- (32-Bit). Entonces debe aparecer un solo enlace, con ReleaseDate = 17 Aug 2007. Ese es el que hay que descargar.

  • El manual de instalación y configuración está aquí.


Es muy importante tomar en cuanta todos los puntos del manual. Los más importantes considero que son:

  • Hay que elegir instalar el unixODBC en el proceso de configuración.

  • Las variables de entorno que se necesitan para que funcione el driver. La unica que no está bien especificada es la de ORACLE_HOME, que debe ser:

    export ORACLE_HOME = /usr/lib/oracle/xe/app/oracle/product/10.2.0/server


  • Se debe contar con el driver QODBC3 de Qt3. Para asegurarse que existe se puede revisar en el asistente de conexión a Bases de Datos que trae Qt3; QODBC3 deberá aparecer en el listado de controladores. Si no es así descargarlo con tu gestor de paquetes.

  • El nombre de la base de datos en el SqlString debe ser ORACLE (debido a la forma de configuración del driver).

  • El código de conexión:

    QSqlDatabase *miData = QSqlDatabase::addDatabase("QODBC3");
    miData->setDatabaseName("ORACLE");
    miData->setUserName("miEsquema");
    miData->setPassword("miPwl");
    miData->setHostName("localhost");


  • La generación del Makefile (estando en la carpeta del proyecto):

    qmake "INCLUDEPATH+=/usr/local/easysoft/unixODBC/include" "LIBS+=-L/usr/local/easysoft/unixODBC/lib -lodbc" -o Makefile nombreProyecto.pro

    Ojo que entre el primer parametro entre comillas y el segundo, debe haber un espacio de lo contrario compilara bien pero mostrar error en la conexión.
    Y luego el conocido:

    make


Hay que hacerlo con paciencia porque si se omite algún detalle, no va a funcionar.

Perserverancia

A SEGUIR ADELANTE

32 comentarios:

Centinela dijo...

vos mira una pregunta:
en el enlace aparecen versiones como:

10.1
10.2
11.1

cual de todas debo bajar?
para poder conectarme

idesisnery dijo...

Si te referias el driver, ya edite el post con las especificaciones de cual tenes que descargar.

Centinela dijo...

vieras que cuando hago lo de:
cd /usr/lib/instantclient_10_2
./sqlplus username/password@//machine_name:port/database_name
me dice
fallo de segmentacion

no se a que se debe esto.

idesisnery dijo...

Lo que tenes que hacer agrear al /usr/lib/ el directorio donde istalaste el cliente, en mi caso quedaría:

/usr/lib/oracle/xe/app/oracle/product/10.2.0/client/bin/

Luego allí ejecuta el sqlplus:

./sqlplus

En UserName escribi:

Enter user-name: nombreUsuario@localhost

Y luego te va a pedir tu password

Enter password: tuPasswd

Allí tendría que hacer la conexión.

Alejandra dijo...

Ala tu, gracias por la ayuda!!!!;)

Una duda.... el drive que propones para descargar es el: Linux-x86- (32-Bit) pero mi compu es de 64, sera que no da clavo????? o sera necesario otro drive?????

idesisnery dijo...

Alli en el listado de plataformas aparece la de 64 bits para linux, así se acopla a tu cpu ;)

ColomByte dijo...

Fíjate que a mi también me da el error “Fallo de segmentación (core dumped)” cuando ingreso:

cd /usr/lib/instantclient_10_2
./sqlplus username/password@//machine_name: port/database

Lo que no entiendo es eso de que tengo que agregar al /usr/lib/ el directorio donde instalaste el cliente, por que a mi no me aparece la carpeta client en la dirección '/usr/lib/oracle/xe/app/oracle/product/10.2.0'

¿Que puedo hacer?

idesisnery dijo...

Lo que podes hacer es utilizar el buscador de archivos para encontrar donde se instalo el cliente de oracle en tu equipo. Te podes basar buscando el archivo 'sqlplus', o simplemente la carpeta 'XE' que dentro de ella debería estar el Server y el Client de Oracle. Cualquier cosa me comentas.

HugoVelez dijo...

cuando ejecuto este comando

./isql -v ORACLE

me da el siguiente error:

[08001][unixODBC][Easysoft][Oracle]ORA-12154: TNS:could not resolve the connect identifier specified
[ISQL]ERROR: Could not SQLConnect

ya revise las variables de entorno, todas las declare como el manual indica y revise que todo este correcto.
¿que puede ser la causa de este error?

idesisnery dijo...

Si pudieras colocar aquí el contenido del archivo: /etc/odbc.ini para ver que datos está utilizando para conectarse. Es lo que podría estar causando el error.

HugoVelez dijo...

este es el contenido del archivo /etc/odbc.ini

[ORACLE]
Driver = ORACLE
Database = ORACLE
User = administrador
Password = admin
METADATA_ID = 0
ENABLE_USER_CATALOG = 1
ENABLE_SYNONYMS = 1

idesisnery dijo...

El valor de Database debería ser:

Database = XE

Que es el nombre de la base de datos Oracle.

Gus dijo...

vos, fijat q yo todavia ando trabado en donde hay q ejecutar el sqlplus para ver si todo anda bien:

./sqlplus username/password@//machine_name: port/database

me sale este error:

ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor

vos mencionaste q hay q poner en user-name: nombreUsuario@localhost, pero ese usuario es el q creas en oracle verdad? o hay q crear un cliente o algo parecido? no sabes como puedo solucionar ese error?

idesisnery dijo...

Exactamente. El usuario y password con el que tenés que ingresar es alguno que hayas creado en Oracle.

Tambien podes conectarte con el default: 'sys' o 'system' y el password de estos es el que configuraste en el proceso de instalación.

Ahora, el error que te está dando suele suceder porque no se ha iniciado el listener de Oracle. Esto puede suceder porque durante el proceso de configuración especificaste que no se iniciara junto con el sistema operativo.

Para solucionarlo tenés que irte a una de las opciones que instal Oracle y seleccionar: 'Iniciar Base de datos'.

Para que inicie junto con tu sistema tendrías que investigar como se hace de acuerdo a la distribución de Linux que usas.

Hugo Renato dijo...
Este comentario ha sido eliminado por el autor.
HugoVelez dijo...

gracias, ya me funciono lo que te habia dicho.

ahora bien tengo un nuevo problema, fijate que ya cuento con el Driver QODBC3 de Qt3, pero cuando intento hacer la conexion con el asistente de conexión a Bases de Datos que trae Qt3 me da error, en los campos escribo esto:

Name: conexion1
driver: QODBC3
Database Name: ORACLE
Username: administrador
password: admin
hostname: localhost
port: (default)

ya intentente colocando en port: (default),8080,1521. Y lo mismo no puede hacer la conexion,tambien ya me segure que el servicio de oracle este corriendo. el Error que me da es el siguiente:

Could not connect to the database.
Please ensure that the database server is running and that all the connection information is correct.
[QODBC3: Unable to connect]

¿que podra ser? ya lo intente hacer a nivel de codigo, y los resultados son los mismos.

idesisnery dijo...

A nivel del asistente no te va a funcionar, ya que las librerías se incluyen con los parámetros que colocas al qmake. Asegurate de estar incluyendo con el qmake los parámetros indicados en el post.

Si ya entraste a la consola del SQL mediante ./isql -v ORACLE entonces el driver ODBC está bien instaldo, el problema podría ser en el código o como te digo en los parámetros del qmake. Cualquier cosa me contas.

HugoVelez dijo...

pues fijate que si ya pude entrar a la consola, el qamke lo hago tal y como lo posteaste. es mas este codigo:

QSqlDatabase *db = QSqlDatabase::addDatabase ("QODBC3");
db->setDatabaseName ("ORACLE");
db->setUserName ("administrador");
db->setPassword ("admin");
db->setHostName ("localhost")

me funciona,en el puntero *db, si la conexion fue exitosa db!=NULL, tambien tiene dos metodos open y openError, estos metodos indican si la conexion fue exitosa. En mi caso la conexion es exitosa, Bueno el problema esta cuando hago un select, lo hago de esta forma

QSqlQuery Consulta( "SELECT * FROM SECCION;", db);

pues Consulta no tiene nada, ningun dato , la tabla SECCION existe, y tiene registros, pero no retorna nada.

Yo ya lo probe hacer con la conexion con mysql, y me funcionan, Pero con la conexion en oracle no. Cuando en oracle (ya sea en el SQL plus, o en el entorno grafico de oracle) hago el select, funciona como debe de ser. Pero en el codigo de Qt no. ¿tenes idea por que puede ser?

idesisnery dijo...

Este es el código que tiene mi botón conexión, con el que me muestra en la consola el resultado del select:

CodigoFuente

Cualquier cosa me comentas.

Efrain dijo...

vos fijate que hice lo que dice el manual

unzip instantclient-basic-linux32-10.2.0.2-20060331.zip -d /usr/lib
unzip instantclient-sqlplus-linux32-10.2.0.2-20060331.zip -d /usr/lib

luego
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:
/usr/lib/instantclient_10_2
export LD_LIBRARY_PATH

y a la hora de hacer
cd /usr/lib/instantclient_10_2
./sqlplus System/tato@//localhost:8080/System
me tira: VIOLACION DE SEGMENTO, a que se debe ese error si lo estoy haciendo exactamente como esta en la pagina de instalacion?????
hechame una mano, orale

Gus dijo...

q onda vos Efrain. Vos fijat q yo solo pude arreglar esa onda asi: En lugar d utilizar los .zip para la instalacion, baja los .rpm, y despues los instalas con eso d una vez.

idesisnery dijo...

Lo que tenes que hacer es instalar el cliente de Oracle y a continuación dirigirte a la carpeta bin del cliente (en mi caso esta en: /usr/lib/oracle/xe/app/oracle/product/10.2.0/client/bin/) y alli ejecutas el 'sqlplus'. En nombre de usuario escribi: usuario@localhost y en el pass el pass correspondiente a 'usuario' en oracle. Cualquier cosa alli comentas.

busterblade2099 dijo...
Este comentario ha sido eliminado por el autor.
busterblade2099 dijo...
Este comentario ha sido eliminado por el autor.
Jeff dijo...

Saludos, fijate que tengo un problema, yo creo que instale bien el driver de unixODBC, pero ahora que ya compile el programa de qt, con las instrucciones que aparecen en tu foro, y ejecuto la accion de conectar , me aparece que no tengo instalado QODBC3 y si lo tengo instalado, y qt esta direccionado a la carpeta qt3, sera problema de la instalacion de unixODBC o de qt, de antemano gracias

Centinela dijo...

q tal idesys.
vieras q al compilar y hacer el qmake, funciona bien o almenos eso parece pq no saca ningun error y genera el archivo makefile, sin embargo cuando luego le doy make me dice q el error es que no ecuentra al archivo para cargarlo, algo asi como esto:

[.obj/make]

no se que pasara, no se si me ayudas en esto.
Gracir por tu respuesta

Jeff dijo...

saludos, fijate que el herror correcto que me da es el siguiente:
QSqlDatabase: QODBC3 driver not loaded
QSqlDatabase: available drivers: QODBC3
y el driver QODBC3 si lo tengo instalado, ya que me lo muestra en el wizard de QT, gracias de antemano

idesisnery dijo...

@Jeff: Verifica que haya un espacio entre los 2 parametros que le envias al qmake, me refiero a los 2 strings.

@Centinela: Verifica que tengas todos los paquetes de qt3 instaldos, lo podes hacer en tu gestor de paquetes de tu distribucion.

Cualquier cosa me comentan.

Centinela dijo...

he instalado todos los paquetes referentes a qt3, pero fijate q el error q me da es este:

ringedia@ringedia-laptop:~$ make
g++ -c -pipe -Wall -W -O2 -D_REENTRANT -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -DQT_SHARED -DQT_TABLET_SUPPORT -I/usr/share/qt3/mkspecs/default -I. -I/usr/local/easysoft/unixODBC/include -I/usr/include/qt3 -I.ui/ -I. -I.moc/ -o .obj/form1.o .ui/form1.cpp
make: g++: No se encontró el programa
make: *** [.obj/form1.o] Error 127

idesisnery dijo...

Por lo que se ve, el error no es del driver sino algún problema con el código. La única forma en que podría ayudarte sería viendo el código de tu programa.

Centinela dijo...

Vos gracias.
vieras q me daba el error por no haber configurado bien los paquetes.

Ojo si alguien tiene l mismo problema. primero en su administrador de paquetes verifique tener todos los paquetes referentes a QT3 y a g++.
si es desde consola que los instalas asegurate de darle:
sudo apt-get -f install
o
sudo apt-get check
o la mejor opcion seria
dpkg --configure -a
y listo adios a los problemas
Saludos

idesisnery dijo...

Gracias por tu aporte centinela.