Como abrir una conexion ODBC a base de datos y usarla

Proceso de una conexión ODBC gambas

Se crea un objeto del tipo Connection, asignandole las propiedades necesarias (tipo de base de datos, lugar donde se encuentra, usuario, contraseña, etc), y le llama al método Open para abrirla. Cuando se llama a Open la base de datos esta activa y lista para consultarse.

Comúnmente usando el metodo Exec con el objeto coneccion abierto y activo, se realizan consultas SQL arbirtrarias, sin embargo hay otros metodos mas especificos como Create, Edit o Delete.

El resultado se retorna como un objeto result ? el cual sus propiedades dependeran del tipo de manejador de base de datos, como las filas afectadas o retornadas segun el tipo de consulta SQL realizada.

El objeto Result es el que finalmente se accede y manipula para los datos de la base de datos, y es iterable, es decir se recorre segun la cantidad de filas devueltas (si fue un SQL DDL) o afectadas (si fue un SQL DML), en cada iteraccion se tiene un arreglo pero en donde cada elemento es de un tipo de dato especifico segun el de la tabla consultada o manipulada.

A menos se manejen multiples conexiones, puede ubicar el codigo para conectarse en un Modulo; esto permite pueda ser llamada desde cualquier parte del proyecto en sus clases y modulos, pero si se usan multiples conexciones en distintas instancias es recomendable usar clases, especialmente para manejar traspasos de datos entre distintas base de datos.

Pre-Requisitos

Requisitos

  1. Deberas estar seguro de tener instalados todos los componentes gb.db y todos los paquetes realcionados con ODBC.

  2. Esto no es un ejemplo acerca de sentencias SQL.

  3. El acceso a la base de datos y privilegios dependen de el odbc y el DSN, por favor consulta ODBC y asegura funcionen.

  4. El componente gb.db ha de estar instalado y compilado con soporte ODBC, y estar seleccionado para el proyecto.

  5. Asegurate de probar el DSN con la utilidad isql del paquete UnixODBC en tu linux como isql <DSN> <user> <clave>

Ejemplos ODBC simples: conectar, consultar, manipular

Ejemplo ODBC 1: conectar a una base de datos odbc

Para sencillez de este ejemplo la conexcion esta en un Modulo, pero implemente siempre clases especialmente si maneja multiples conexciones. Este ejemplo asume se tiene definida un DSN llamado "odbctest" consulte la documentacion de ODBC o esta guia sencilla para Debian que sirve para la mayoria de los tipos odbc basados en UnixODBC.

1 Crear un nuevo modulo en tu proyecto, MdbMain. Tenga en cuenta tener preparado y funcionando su DSN previamente.

2 Crear la entrada "Main" de el modulo, esta tendra el codigo que implementara la conexcion y enviara la consulta de base de datos:

       PUBLIC SUB Main()

      END

3 Crear el codigo de la conexcion con una variable "$con" del tipo Connection y el codigo que configura las propiedades:

                DIM $con = New Connection
                try $con.Close()          ' Cierra la conexion el try permite falle sin error
                $con.Type = "odbc"        ' Define el tipo de Conexion
                $con.Host = "odbctest"    ' Nombre de la conexcion ODBC definida en el sistema o por el usuario actual: el DSN
                $con.Login = "dba"        ' Usuario para la conexion la mayoria de los odbc no permite definirla en el odbc.ini
                $con.Password = "sql"     ' Clave de Usuario de la conexcion, la mayoria de los odbc no lo permite en el odbc.ini
                $con.Open()               ' Activamos y Abrimos la conexion, el try es para que permita un error

El codigo resultante sera asi:

       PUBLIC SUB Main()

                DIM $con AS New Connection
                try $con.Close()          ' Cierra la conexion el try permite falle sin error
                $con.Type = "odbc"        ' Define el tipo de Conexion
                $con.Host = "odbctest"    ' Nombre de la conexcion ODBC definida en el sistema o por el usuario actual: el DSN
                $con.Login = "dba"        ' Usuario para la conexion la mayoria de los odbc no permite definirla en el odbc.ini
                $con.Password = "sql"     ' Clave de Usuario de la conexcion, la mayoria de los odbc no lo permite en el odbc.ini
                $con.Open()           ' Activamos y Abrimos la conexion, el try es para que permita un error

                PRINT "Conectado? : " & $con.Opened ' Devolvera TRUE o FALSE segun si "try $con.Open()" fue exitoso
       END

Esto imprimira TRUE o FALSE segun sea exitosa la conexcion.

4 Verificaciones:

Si no puede ver la "T" o " " debe probar si la conexcion ODBC y el DSN son validos y funcionan:

    isql odbctest dba sql -v
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
%

Si algo esta incorrecto mostrara "could connect".

Por favor refierase a la documentacion ODBC Component Documentation para rectificar el DSN "odbctest" este correcto segun la misma.

  1. Notese que aqui nuestro el objecto conexcion $con es manejado globalmente en todo el modulo.

  2. Notese que no se define la propiedad Name porque en conexiones ODBC no es usada.

  3. Notese que no se define la propiedad Database porque en conexiones ODBC es definida segun el tipo de manejador.

  4. Para fines de este ejemplo se tiene definido un DSN llamado "odbctest" y este se usa en la propiedad Host

  5. Conexiones a ODBC con sqlite o mdbtools deben tener las propiedades User y Password asignadas a "" o vacio, pero asignadas, sino falla la conexion.

Vea Tambien

Ejemplo ODBC 2: ejecutar una sentencia de creacion o SQL DDL

Para fines de este ejemplo se reusa los pasos anteriores y tiene definida un DSN llamado "odbctest" y se usa el codigo del ejemplo ODBC 1 anterior Gambas tiene un tipo especial de tratamiento con los resultados de las consultas, el cual es llamado Result.

4 Empleando el modulo y el codigo de conexcion anterior, inserte en el proceso "Main" *despues* de la sentencia "PRINT" la consulta:

       $con.Exec("CREATE TABLE IF NOT EXISTS tabla1 ( columna1 VARCHAR(20), columna2 VARCHAR(20))")

El codigo resultante sera:

       PUBLIC SUB Main()

                DIM $con AS New Connection
                try $con.Close()          ' Cierra la conexion el try permite falle sin error
                $con.Type = "odbc"        ' Define el tipo de Conexion
                $con.Host = "odbctest"    ' Nombre de la conexcion ODBC definida en el sistema o por el usuario actual: el DSN
                $con.Login = "dba"        ' Usuario para la conexion la mayoria de los odbc no permite definirla en el odbc.ini
                $con.Password = "sql"     ' Clave de Usuario de la conexcion, la mayoria de los odbc no lo permite en el odbc.ini
                $con.Open()               ' Activamos y Abrimos la conexion, el try es para que permita un error
                PRINT "Conectado? : " & $con.Opened ' Devolvera TRUE o FALSE segun si "try $con.Open()" fue exitoso

                $con.Exec("CREATE TABLE IF NOT EXISTS tabla1 ( columna1 VARCHAR(20), columna2 VARCHAR(20))")
       END

Esto creara una nueva tabla en la base de datos, no importando si la tabla ya existe o no, por la parte "IF NOT EXISTS", sim embargo no aegurara las mismas columnas si la tabla existente es distinta.

  1. Notese que aqui ejecutamos una sentencia y no nos preocupamos por la obtencion real del resultado en el manejador.

  2. En el siguiente ejemplo par obtener el resultado si exitoso o no se manejara con el objeto Result.

  3. Para fines de este ejemplo se tiene definido un DSN llamado "odbctest" y este se usa en la propiedad Host

  4. Conexiones a ODBC con sqlite o mdbtools deben tener las propiedades User y Password asignadas a "" o vacio, pero asignadas, sino falla la conexion.

Vea Tambien

Ejemplo ODBC 3: ejecutar una sentencia de manipulacion de datos o SQL DML

Para fines de este ejemplo se reusa los pasos anteriores y tiene definida un DSN llamado "odbctest" y se usa el codigo del ejemplo ODBC 2 anterior Gambas tiene un tipo especial de tratamiento con los resultados de las consultas, el cual es llamado Result.

5 Defina una nueva variable en el subproceso Main "rs" del tipo Result, que abstraera el manejo de datos respecto resultados.

       DIM rs AS Result

6 Empleando el modulo y el codigo de conexion anterior, inserte en el proceso "Main" despues de la sentencia "Exec" del CREATE la consulta:

       rs = $con.Exec("INSERT INTO tabla1 ( columna1, columna2) VALUES ( 'pepe', 'pablo')")
       PRINT "registro insertados "

El codigo resultante sera:

       PUBLIC SUB Main()

         DIM rs AS Result
         DIM $con AS New Connection

           try $con.Close()          ' Cierra la conexion el try permite falle sin error
           $con.Type = "odbc"        ' Define el tipo de Conexion
           $con.Host = "odbctest"    ' Nombre de la conexcion ODBC definida en el sistema o por el usuario actual: el DSN
           $con.Login = "dba"        ' Usuario para la conexion la mayoria de los odbc no permite definirla en el odbc.ini
           $con.Password = "sql"     ' Clave de Usuario de la conexcion, la mayoria de los odbc no lo permite en el odbc.ini
           $con.Open()           ' Activamos y Abrimos la conexion, el try es para que permita un error
           PRINT "Conectado? : " & $con.Opened ' Devolvera TRUE o FALSE segun si "try $con.Open()" fue exitoso

           $con.Exec("CREATE TABLE IF NOT EXISTS tabla1 ( columna1 VARCHAR(20), columna2 VARCHAR(20))")

           rs= $con.Exec("INSERT INTO tabla1 ( columna1, columna2) VALUES ( 'pepe', 'pablo')")
           PRINT "registro insertados "
  
     END

Esto creara una nuevo registro en la tabla recien creada, no importando si la tabla existe o no o si el registro existe, ya que nunca se definio una llave primaria. La salida mostrara "registros insertados" si inserta correctamente.

  1. La propiedad Count trae cantidades cuando es un SQL DML, de resto solo devuelve TRUE que es (-1) o FALSE

  2. El objeto Result tiene el resultado, si hay filas insertadas/afectadas o no usando Count.

  3. Para fines de este ejemplo se tiene definido un DSN llamado "odbctest" y este se usa en la propiedad Host

  4. Conexiones a ODBC con sqlite o mdbtools deben tener las propiedades User y Password asignadas a "" o vacio, pero asignadas, sino falla la conexion.

Vea Tambien

Ejemplo ODBC 4: ejecutar una sentencia de consulta de datos o SQL DDL

Para fines de este ejemplo se reusa los pasos anteriores y tiene definida un DSN llamado "odbctest" y se usa el codigo del ejemplo ODBC 3 anterior Gambas tiene un tipo especial de tratamiento con los resultados de las consultas, el cual es llamado Result.

7 Empleando el modulo y el codigo de conexion anterior, inserte en el proceso "Main" despues de la ultimo sentencia "PRINT" el codigo:

       rs = $con.Exec("SELECT columna1, columna2 FROM tabla1 ")

8 Esto obtiene los registros consultar en el objeto Result, para acceder a cada fila y sus columnas se itera sobre el mismo:

       rs = $con.Exec("SELECT columna1, columna2 FROM tabla1 ")
       WHILE (rs.Available)
             PRINT "registro encontrado: valor columna1:" & rs!columna1 & ", valor columna2:" & rs["columna2"]
             rs.MoveNext()
       WEND

El codigo resultante sera:

       PUBLIC SUB Main()

         DIM rs AS Result
         DIM $con AS New Connection

           try $con.Close()          ' Cierra la conexion el try permite falle sin error
           $con.Type = "odbc"        ' Define el tipo de Conexion
           $con.Host = "odbctest"    ' Nombre de la conexcion ODBC definida en el sistema o por el usuario actual: el DSN
           $con.Login = "dba"        ' Usuario para la conexion la mayoria de los odbc no permite definirla en el odbc.ini
           $con.Password = "sql"     ' Clave de Usuario de la conexcion, la mayoria de los odbc no lo permite en el odbc.ini
           $con.Open()           ' Activamos y Abrimos la conexion, el try es para que permita un error
           PRINT "Conectado? : " & $con.Opened ' Devolvera TRUE o FALSE segun si "try $con.Open()" fue exitoso

           $con.Exec("CREATE TABLE IF NOT EXISTS tabla1 ( columna1 VARCHAR(20), columna2 VARCHAR(20))")

           rs= $con.Exec("INSERT INTO tabla1 ( columna1, columna2) VALUES ( 'pepe', 'pablo')")
           PRINT "registro insertados "

         rs = $con.Exec("SELECT columna1, columna2 FROM tabla1 ")
         WHILE (rs.Available)
               PRINT "registro encontrado: valor columna1:" & rs!columna1 & ", valor columna2:" & rs["columna2"]
               rs.MoveNext()
         WEND
  
     END

La salida mostrara "registros insertados" y despues mostrara una linea por cada registro en la tabla encontrado, note que el acceso a los valores de las columnas se puede realizar de dos maneras distintas. NOTA: Esto creara otro registro en la tabla recien creada, no importando si la tabla existe o no o si el registro existe, ya que nunca se definio una llave primaria.

  1. La propiedad Count trae cantidades cuando es un SQL DML, de resto solo devuelve TRUE que es (-1) o FALSE

  2. El objeto Result tiene el resultado, si hay filas insertadas/afectadas o no usando Count.

  3. Para fines de este ejemplo se tiene definido un DSN llamado "odbctest" y este se usa en la propiedad Host

  4. Conexiones a ODBC con sqlite o mdbtools deben tener las propiedades User y Password asignadas a "" o vacio, pero asignadas, sino falla la conexion.

Vea Tambien

Ejemplos ODBC avanzados: traspasar datos, manipular y manejar errores

El modulo gb.db de gambas no implementa todas las funciones que proveen otros manejadores para el ODBC, aunque ha sido tema de discusion proveer propiedades y metodos que no se cumple para todo como dice la documentacion pues el modulo actual se dice es como una capa entre el manejador y el DBMS, este no es el caso para el de ODBC por ende ejemplos para casos especiales estan documentados.

Ejemplo ODBC 5: manejando multiples conexciones y errores

seccion en contruccion

Ejemplo ODBC 6: manejar si un registro se inserta o no

seccion en contruccion

Ejemplo ODBC 7: manejar grandes cantidad de registros

Para este caso aun no se encuentra solucion optima, ni soluciones provistas en la lista de correo. Usar MoveNext no sirve ya que ODBC no tiene un recuento de registros obtenidos.

Vea tambien