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