FoxPress – Noviembre 2004

 

      EL API de MySQL desde Fox

 

 

Por la Redacción de Foxpress                                                                             

 

 

 

        Para usar el API de MySQL desde Fox o desde cualquier otra herramienta tienes que usar la librería libmySQL.dll

Esa librería se te instala por defecto en las instalaciones de MySQL

En toda relación con Bases de Datos, lo primero será iniciar la conexión para eso tenemos que usar dos funciones del API

    mysql_init    inicializa un descriptor de conexión de la base de datos.
    mysql_real_connect     crea una conexión identificada por el descriptor

Para poder usarlas en Fox escribiremos:

Declare Integer mysql_init In libmySQL.Dll ;

    Integer db_ID

   

db_ID = 0

db_ID = mysql_init(db_ID)

 

If db_ID = 0 Then

   MESSAGEBOX("error mysql_init "+ db_ID)

End

Endif

 

Declare Integer mysql_real_connect In libmySQL ;

    INTEGER lMYSQL, ;

    STRING sHostName ,;

    STRING sUserName,;

    STRING sPassword ,;

    STRING sDbName ,;

    INTEGER lPortNum,;

    STRING sSocketName ,;

    INTEGER lFlags

 

HostNam = "127.0.0.1"

UserNam = "root"

PassWrd = ""

DB_Name = "test" && Nombre de la Base de Datos

PortNum = 3306

 

 

test=mysql_real_connect(db_ID,HostNam, UserNam, PassWrd, DB_Name,

PortNum,"",0)

 

IF test=0

    MESSAGEBOX("error mysql_real_connect")

ELSE

    ? test

Endif

 

Si se nos devuelve un valor distinto de 0 quiere decir que la conexión se ha establecido satisfactoriamente. Si devuelve un Nulo entonces se ha producido un error.

 

Para cerrar las conexiones debemos usar:

 

? mysql_close (db_ID)

 

pero previamente hay que declararla con:

 

Declare Integer mysql_close In libmySQL.Dll ;

    Integer db_ID

 

Esta instrucción cierra la conexión y libera los recursos.

 

Para crear una Base de Datos, usaremos:

 

Declare Integer mysql_query In libmySQL ;

    INTEGER lMYSQL, ;

    STRING sCadena

 

Y la siguiente instrucción nos creará una Base de datos llamada Datos1:

 

? mysql_query(db_ID, "create database DATOS1")

 

si queremos poner una tabla en la Base de Datos Datos1 deberemos:

 

? mysql_query(db_ID, "CREATE TABLE DATOS1.Tabla1(campo1 Varchar(100))")

 

Para traernos un conjunto de registros deberemos escribir:

 

DECLARE RtlMoveMemory IN kernel32 As CopyMemory;

    STRING @Dest, INTEGER Src, INTEGER nLength

 

If (mysql_query(db_ID, "select * from datos1.tabla1") = 0) Then

pMyRES = mysql_store_result(db_ID)

If (pMyRES <> 0) Then

 

        nbFields = mysql_num_fields(pMyRES)

        If nbFields > 0 Then

 

            For i = 0 To mysql_num_rows(pMyRES) - 1

 

                pMyROW = mysql_fetch_row(pMyRES)

                = CopyMemory(@cBuffer, pMyROW, LEN(cBuffer))

                lcBuffer = ALLTRIM(SUBSTR(cBuffer, 1,;

AT(CHR(0), cBuffer)-1) )

                lntam = LEN(lcBuffer)

                ? RIGHT(lcBuffer,lntam -8)

 

            Next

        EndIf

    EndIf

    mysql_free_result (pMyRES)

EndIf

 

Que nos devuelve por pantalla el contenido de cada uno de los registros de la tabla

 

Para listar las tablas de la Base de datos podemos usar la función mysql_list_tables(). Esta función tiene dos parámetros, en primer lugar el handle y luego una máscara para filtrar las tablas.

El valor de retorno es un hadle hacia el resultado de la petición es en realidad un puntero a la estructura MYSQL_RES. Si se ha producido un error el valor de respuesta en nulo.

La función,  mysql_num_rows(), por su parte reenvia el número de registos contenidos en el resultado

Los datos como se puede ver en el ejemplo anterior, los recuperamos con  CopyMemory()

Una vez hecha la consulta es necesario liberar los recursos mediante mysql_free_result().

Para Accéder a los datos de una tabla usamos mysql_query() y devuelve 0. Para acceder a los resultados de la consulta, es necesario llamar a la función mysql_store_result(). mysql_fetch_row() nos envía el valor de los campos, yustapuesto en una cadena de caracteres únicos.  No podemos leer toda la cadena de caracteres con la cadena CopyMemory(), debemos conocer el numero de octetos a leer.

La solución a nuestro problema es la función mysql_fetch_lengths(), que reenvia una tabla conteniendo el tamaño de los diferentes campos.

Podemos ahora leer el valor de cada campo. El esquema a continuación nos muestra un ejemplo de lo que se puede obtener.

Leer la estructura de una tabla

La función mysql_fetch_fields() reenvía una tabla de estructuras MYSQL_FIELD, donde cada elemento representa un campo de la tabla. Los atributos de la estructura MYSQL_FIELD dan las informaciones relativas al campo.

4

6

2

1

10

Tabla enviada por mysql_fetch_lenghts()

J

E

A

N

.

D

U

P

O

N

T

.

1

0

.

5

.

S

T

R

A

S

B

U

R

G

O

.

Tabla enviada por mysql_fetch_row()

. = El pequeño punto de separación es un Nulo

Gestion de errores

Para obtener el código de error usamos mysql_errno(). Un valor nulo indica que no ha habido ningún error.

 

 

 

FoxPress – Noviembre de 2004

© 2004 FoxPress. All rights reserved