MANUAL DE MARIADB
para FiveWin / Harbour
Guia Practica de Conexion, Consultas y Manejo de Datos
Basado en los ejemplos oficiales de FiveWin
Version 2025
Realizado por Carlos Atúncar Hernandez
Contenido
1\. Introduccion
2\. Conexion a MariaDB
3\. Comandos y funciones principales
4\. RowSet: consultas y edicion de datos
5\. Operaciones CRUD
6\. Manejo de tablas
7\. Relaciones Padre-Hijo
8\. Funciones avanzadas
9\. Encriptacion AES
10\. Datos espaciales (GEO)
11\. Unicode y codificaciones
12\. Importar DBF a MariaDB
13\. FWMariaRecord: edicion de registros individuales
14\. Comparacion FWH vs ADO vs Dolphin
15\. Referencia rapida de metodos
1\. Introduccion
FiveWin for Harbour incluye soporte nativo para MariaDB/MySQL a traves de la funcion maria\_Connect() y un conjunto de clases que permiten trabajar con bases de datos relacionales de forma sencilla, sin necesidad de drivers ODBC ni componentes externos.
Este manual cubre el uso practico de MariaDB en FiveWin, basado en los ejemplos oficiales incluidos en la distribucion (maria01.prg a maria16.prg y otros).
Requisitos
FiveWin for Harbour 25.x o superior
Servidor MariaDB 10.x / MySQL 5.7+ accesible en red o local
Incluir fivewin.ch en el programa
Habilitar Unicode: FW\_SetUnicode( .t. ) si se usan caracteres especiales
Arquitectura de la conexion
La conexion nativa de FiveWin a MariaDB se realiza directamente sin ODBC, lo que ofrece mayor velocidad y simplicidad. El objeto de conexion (oCn) es el punto central desde el que se realizan todas las operaciones.
2\. Conexion a MariaDB
2.1 Funcion maria\_Connect()
La funcion principal para establecer la conexion es maria\_Connect(). Devuelve un objeto de conexion o NIL si falla.
Sintaxis
oCn := maria\_Connect( cConexion, lMostrarError )
oCn := maria\_Connect( cHost, cDatabase, cUser, cPassword \[, nPort\] )
Parametros \- Forma con cadena de conexion
| Parametro | Tipo | Descripcion |
|---|---|---|
| cConexion | C | Cadena con formato: host:puerto,base,usuario,password |
| lMostrarError | L | .t. muestra mensaje si falla la conexion |
Parametros \- Forma extendida (via FWCONNECT)
| Parametro | Tipo | Descripcion |
|---|---|---|
| cHost | C | Nombre o IP del servidor. Puede incluir :puerto (ej: localhost:3306) |
| cDatabase | C | Nombre de la base de datos |
| cUser | C | Usuario de MariaDB |
| cPassword | C | Contrasena |
| nPort | N | Puerto (opcional, default 3306\) |
Ejemplos de conexion
// Forma 1: cadena compacta
oCn := maria\_Connect( "208.91.198.197:3306,fwhdemo,usuario,password", .t. )
// Forma 2: parametros separados (local)
oCn := maria\_Connect( "localhost", "fwh", "fivetec1\_antonio", "1234" )
// Forma 3: via comando FWCONNECT (fivewin.ch)
FWCONNECT oCn HOST cHost USER cUser PASSWORD cPassword DATABASE cDB
// Forma 4: funcion de demo incluida en FiveWin
oCn := FW\_DemoDB() // conecta al servidor de demo de FiveWin
oCn := FW\_DemoDB( 1 ) // servidor de demo alternativo
oCn := FW\_DemoDB( "ADO" ) // conexion via ADO
oCn := FW\_DemoDB( "DLP" ) // conexion via TDolphin
Verificar conexion y cerrar
if ( oCn := maria\_Connect( ... ) ) \== nil
MsgStop( "No se pudo conectar al servidor" )
return nil
endif
// ... operaciones con la base de datos ...
oCn:Close() // o oCn:End()
2.2 Propiedades del objeto de conexion
| Propiedad | Tipo | Descripcion |
|---|---|---|
| lLogErr | L | Activa el registro de errores en archivo .log |
| lShowErrors | L | Muestra errores en pantalla automaticamente |
| nError | N | Codigo del ultimo error (0 \= sin error) |
| LockTimeOut | N | Tiempo de espera para bloqueos (segundos) |
| lUnicode | L | Modo Unicode activo |
oCn:lLogErr := .t. // activa log de errores
oCn:lShowErrors := .t. // muestra errores en pantalla
3\. Comandos y Funciones Principales
3.1 Resumen de metodos del objeto de conexion
| Metodo | Descripcion |
|---|---|
| oCn:RowSet( cSQL \[, aParams\] ) | Ejecuta una consulta y devuelve un RowSet editable |
| oCn:RecSet( cTabla, nRecs ) | Lee n registros de una tabla (eficiente para tablas grandes) |
| oCn:Query( cSQL ) | Ejecuta consulta (compatible TDolphin) |
| oCn:Execute( cSQL ) | Ejecuta sentencia SQL sin resultado (INSERT, UPDATE, DELETE, CREATE...) |
| oCn:QueryResult( cSQL ) | Devuelve el valor de la primera celda del resultado |
| oCn:ListTables() | Devuelve array con nombres de tablas de la BD |
| oCn:TableExists( cTabla ) | Devuelve .t. si la tabla existe |
| oCn:CreateTable( cTabla, aEstructura ) | Crea una tabla nueva |
| oCn:DropTable( cTabla ) | Elimina una tabla |
| oCn:Insert( cTabla, cCampos, aData ) | Inserta uno o multiples registros |
| oCn:UpdateSummary( ... ) | Actualiza totales de tabla maestra desde detalle |
| oCn:ImportFromDbf( cArchivo ) | Importa un archivo DBF a MariaDB |
| oCn:PivotArray( ... ) | Genera tabla pivot |
| oCn:Close() / oCn:End() | Cierra la conexion |
| oCn:ShowError() | Muestra el ultimo error |
| oCn:setAutoCommit( lVal ) | Activa/desactiva auto commit para transacciones |
| oCn:TableStructure( cTabla ) | Devuelve estructura de la tabla |
3.2 Configuracion inicial recomendada
function Main()
local oCn
SET DATE ITALIAN // formato dd/mm/yyyy
SET CENTURY ON
FW\_SetUnicode( .t. ) // habilitar Unicode
FWNumFormat( "A", .t. ) // formato numerico
oCn := maria\_Connect( "localhost", "mibd", "usuario", "clave" )
if oCn \== nil
MsgStop( "Error de conexion" )
return nilendif
oCn:lShowErrors := .t.
// ... codigo de la aplicacion ...
oCn:Close()
return nil
4\. RowSet: Consultas y Edicion de Datos
El RowSet es el objeto central para trabajar con datos en FiveWin/MariaDB. Representa un conjunto de registros que puede mostrarse en un XBrowse y editarse directamente.
4.1 Crear un RowSet
// Tabla completa
oRs := oCn:RowSet( "clientes" )
// Con SQL personalizado
oRs := oCn:RowSet( "SELECT \* FROM clientes WHERE activo \= 1" )
// SQL con parametros (evita SQL injection)
oRs := oCn:RowSet( "SELECT \* FROM clientes WHERE estado \= ?", { cEstado } )
// JOIN entre tablas
TEXT INTO cSql
SELECT C.ID, C.FIRST, C.CITY, S.NAME AS STATENAME
FROM customer C
LEFT JOIN states S ON C.STATE \= S.CODE
ENDTEXT
oRs := oCn:RowSet( cSql )
4.2 Mostrar en XBrowse
// Modo simple
XBROWSER oRs FASTEDIT TITLE "Clientes"
// Con opciones avanzadas
XBROWSER oRs FASTEDIT AUTOSORT AUTOFIT SHOW RECID ;
TITLE "Clientes" ;
SETUP ( oBrw:lFastEdit := .f. )
4.3 Metodos del RowSet
| Metodo | Descripcion |
|---|---|
| oRs:GoTop() | Va al primer registro |
| oRs:GoBottom() | Va al ultimo registro |
| oRs:Skip(n) | Avanza n registros |
| oRs:FieldGet(n) | Obtiene valor del campo n |
| oRs:FieldGet('nombre') | Obtiene valor por nombre de campo |
| oRs:Fields('campo'):lReadOnly := .t. | Pone campo como solo lectura |
| oRs:Delete() | Elimina el registro actual |
| oRs:ReQuery() | Recarga los datos del servidor |
| oRs:ReQuery( aParams ) | Recarga con nuevos parametros |
| oRs:ReSync() | Sincroniza el registro actual con el servidor |
| oRs:Refresh() | Refresca los datos |
| oRs:SetDefault('campo', valor) | Establece valor por defecto para nuevos registros |
| oRs:SetFilter('campo \= ?', {val}) | Aplica filtro parametrizado |
| oRs:ReFilter( aParams ) | Vuelve a filtrar con nuevos parametros |
| oRs:Close() / oRs:End() | Cierra el RowSet |
| oRs:lAutoAppend := .t. | Habilita agregar registros desde el browse |
| oRs:EditBaseRecord(...) | Abre dialogo para editar registro completo |
4.4 Acceso a campos como propiedades
Los campos del RowSet pueden accederse directamente como propiedades del objeto:
oRs := oCn:RowSet( "clientes" )
? oRs:nombre // lee el campo "nombre"
? oRs:salario // lee el campo "salario"
oRs:estado := "A" // escribe en el campo
4.5 RecSet para tablas grandes
// Lee solo los primeros 1000 registros, carga el resto bajo demanda
oRs := oCn:RecSet( "custbig", 1000 )
oRs:nLastRec := oCn:QueryResult( "SELECT COUNT(\*) FROM custbig" )
XBROWSER oRs TITLE "Tabla grande" SHOW RECID FASTEDIT
5\. Operaciones CRUD
5.1 INSERT \- Insertar registros
// Un registro
oCn:Insert( "clientes", "nombre,ciudad,salario", ;
{ { "Juan Lopez", "Madrid", 3500 } } )
// Multiples registros de una vez (mas eficiente)
local aData := {}
for i := 1 to 1000
AAdd( aData, { "Nombre" \+ Str(i), "Ciudad", HB\_RandomInt(1000,9999) } )
next
oCn:setAutoCommit( .f. ) // inicio de transaccion
oCn:Insert( "clientes", "nombre,ciudad,salario", aData )
oCn:setAutoCommit( .t. ) // commit
5.2 SELECT \- Consultar datos
// Valor unico
nTotal := oCn:QueryResult( "SELECT COUNT(\*) FROM clientes" )
nSuma := oCn:QueryResult( "SELECT SUM(salario) FROM clientes" )
// Resultado como array
aEstados := oCn:Execute( "SELECT CODE, NAME FROM states" )
// RowSet completo
oRs := oCn:RowSet( "SELECT \* FROM clientes WHERE ciudad \= ?", { cCiudad } )
5.3 UPDATE \- Actualizar datos
// Directo via SQL
oCn:Execute( "UPDATE clientes SET salario \= salario \* 1.10 WHERE ciudad \= " \+ ;
Chr(39) \+ cCiudad \+ Chr(39) )// A traves del RowSet (edicion directa en browse o codigo)
oRs := oCn:RowSet( "SELECT \* FROM clientes WHERE id \= ?", { nId } )
oRs:salario := 4000
oRs:Save() // guarda los cambios
5.4 DELETE \- Eliminar registros
// Via SQL
oCn:Execute( "DELETE FROM clientes WHERE id \= " \+ cValToChar( nId ) )
// Via RowSet
oRs:Delete()
oRs:ReQuery()
5.5 Actualizar tabla maestra con totales del detalle
// Actualiza campos de suma en tabla maestra a partir de tabla de detalle
oCn:UpdateSummary( "facturas", "id", "total,cantidad", ;
"lineas", "fid", "importe,qty" )Util para mantener totales en cabeceras de facturas/pedidos actualizados automaticamente.
6\. Manejo de Tablas
6.1 Crear tabla
// Estructura: { nombre, tipo, longitud, decimales \[, opciones\] }
oCn:CreateTable( "clientes", { ;
{ "nombre", "C", 30, 0 }, ;
{ "ciudad", "C", 20, 0 }, ;
{ "salario", "N", 10, 2, "DEFAULT 0" }, ;
{ "activo", "L", 1, 0 }, ;
{ "fecha", "D", 8, 0 }, ;
{ "notas", "M", 0, 0 } } )
Tipos de datos soportados:
| Tipo FiveWin | Tipo MariaDB | Descripcion |
|---|---|---|
| C | VARCHAR | Caracter / texto corto |
| N | DECIMAL | Numerico |
| D | DATE | Fecha |
| L | TINYINT(1) | Logico (booleano) |
| M | TEXT / BLOB | Memo / texto largo |
| \+ | INT AUTO\_INCREMENT | Entero autoincrementable |
| \= | TIMESTAMP | Fecha/hora automatica |
| @ | DATETIME | Fecha y hora |
| ^ | BLOB | Datos binarios |
6.2 Opciones especiales en columnas
// Auto-increment (clave primaria automatica)
{ "id", "+", 4, 0 }
// Timestamp automatico
{ "modificado", "=", 8, 0 }
// Con comentario para comportamiento especial
{ "codigo", "C", 10, 0, "comment'case:upper'" }, // fuerza mayusculas
{ "nombre", "C", 30, 0, "comment'case:proper'" }, // fuerza primera mayuscula
// Con valor por defecto
{ "cantidad", "N", 6, 3, "DEFAULT 1" }
// Con charset especifico
{ "texto\_utf8", "C", 40, 0, "utf8" }
{ "texto\_latin","C", 40, 0, "latin1" }
// Clave foranea (referencia)
{ "pid", "REFERENCES tabla\_padre( id )" }
6.3 Verificar y eliminar tablas
if oCn:TableExists( "clientes" )
oCn:DropTable( "clientes" )
endif
// Listar todas las tablas
XBROWSER oCn:ListTables() TITLE "Tablas disponibles"
7\. Relaciones Padre-Hijo
7.1 Un padre con un hijo
oStates := oCn:RowSet( "states" )
// Metodo 1: agregar hijo con SQL
oStates:AddChild( "SELECT \* FROM customer WHERE state \= states.code" )
// Metodo 2: agregar hijo con RowSet existente
oCust := oCn:RowSet( "customer" )
oStates:AddChild( oCust, "state \= states.code" )
// En el browse padre, sincronizar el hijo al cambiar de fila:
oBrwParent:bChange := { || oStates:SyncChild(), oBrwChild:GoTop(), oBrwChild:Refresh() }
7.2 Un padre con dos hijos (SetFilter)
oRsState := oCn:RowSet( "SELECT \* FROM states ORDER BY name" )
oRsCity := oCn:RowSet( "SELECT id, state, city FROM customer ORDER BY state, city" )
oRsCust := oCn:RowSet( "SELECT id, state, first FROM customer ORDER BY state" )
// Filtros parametrizados
oRsCity:SetFilter( "STATE \= ?", { oRsState:code } )
oRsCust:SetFilter( "STATE \= ?", { oRsState:code } )
// Actualizar hijos al cambiar de fila en el padre
oBrwState:bChange := {||
oRsCity:ReFilter( { oRsState:code } )
oRsCust:ReFilter( { oRsState:code } )
oBrwCity:Refresh()
oBrwCust:Refresh()
return nil }
7.3 Totales dinamicos con SQL (Running Totals)
TEXT INTO cSql
SELECT id, fecha, descripcion, importe,
( @bal := IF( tipo \= "1", @bal \+ importe, @bal \- importe ) ) AS saldo
FROM ctacte, ( SELECT @bal := 0 ) AS t
WHERE ncli \= ?
ORDER BY fecha
ENDTEXT
oRs := oCn:RowSet( cSql, { nCliente } )
Este patron SQL permite calcular saldos acumulados directamente en el servidor, sin procesar en el cliente.
8\. Funciones Avanzadas
8.1 AutoAppend: agregar registros desde el browse
oRs := oCn:RowSet( "SELECT \* FROM detalle WHERE docid \= ?", { nDocId } )
oRs:lAutoAppend := .t. // habilita agregar con flecha abajo
oRs:SetDefault( "docid", nDocId ) // valor fijo para campo clave
XBROWSER oRs FASTEDIT TITLE "Detalle del documento"
8.2 EditBaseRecord: editar registro completo
// Editar todos los campos aunque el RowSet tenga solo algunos
@ 20,20 BTNBMP PROMPT "Agregar" PIXEL FLAT OF oDlg ;
ACTION oRs:EditBaseRecord( nil, .t., { |oRec| MiDialogoEdicion( oRec ) }, oBrw )
@ 20,130 BTNBMP PROMPT "Editar" PIXEL FLAT OF oDlg ;
ACTION oRs:EditBaseRecord( nil, .f., { |oRec| MiDialogoEdicion( oRec ) }, oBrw, .t. )
// En la funcion de dialogo:
function MiDialogoEdicion( oRec )
local lNuevo := ( oRec:RecNo \== 0 )
// Usar GET oRec:campo, CHECKBOX oRec:campo, etc.
// Guardar: If( oRec:Modified(), oRec:Save(), nil )
return nil
8.3 Tabla Pivot
// aPivot \= array bidimensional con los datos cruzados
aPivot := oCn:PivotArray( "ventas", "region", "producto", "importe", "SUM" )
// Mostrar en XBrowse con posibilidad de invertir ejes
@ 30,10 XBROWSE oBrw SIZE \-10,-10 PIXEL OF oDlg ;
DATASOURCE aPivot AUTOCOLS CELL LINES FOOTERS
// Invertir filas y columnas
oBrw:bRClicked := { || oBrw:InvertPivot() }
8.4 Carga de informacion de zonas horarias
// Cargar archivo timezone\_posix.sql al servidor MariaDB
FWCONNECT oCn HOST cHost USER cUser PASSWORD cPassword DATABASE "mysql"
oCn:lLogErr := .t.
// Leer archivo y ejecutar cada sentencia SQL
oCn:Execute( cSql )
El archivo timezone\_posix.sql se descarga desde dev.mysql.com/downloads/timezones.html
9\. Encriptacion AES
MariaDB incluye funciones nativas de encriptacion AES\_ENCRYPT() y AES\_DECRYPT() que permiten almacenar datos sensibles como contrasenas y credenciales de forma segura.
9.1 Crear tabla con campos encriptados
TEXT INTO cSql
CREATE TABLE usuarios (
id INT AUTO\_INCREMENT PRIMARY KEY,
nombre VARCHAR(20),
login TINYBLOB,
pass VARBINARY(255)
) ENGINE=InnoDB CHARSET=latin1
ENDTEXT
oCn:Execute( cSql )
9.2 Insertar datos encriptados
cSql := "INSERT INTO usuarios (nombre, login, pass) VALUES (" \+ ;
"'andrew'", AES\_ENCRYPT('Andrew', 'miClave'), " \+ ;
"AES\_ENCRYPT('Pass123', 'miClave'))"oCn:Execute( cSql )
9.3 Consultar con desencriptacion
cSql := "SELECT id, nombre, " \+ ;
"AES\_DECRYPT(login,'miClave') AS login, " \+ ;
"AES\_DECRYPT(pass, 'miClave') AS pass " \+ ;
"FROM usuarios"oRs := oCn:RowSet( cSql )
XBROWSER oRs
La clave de encriptacion nunca se almacena en la base de datos. Guardala de forma segura en tu aplicacion o en un archivo de configuracion externo.
10\. Datos Espaciales (GEO)
MariaDB 5.7.1+ soporta el tipo de dato POINT y funciones geometricas para calcular distancias entre coordenadas geograficas.
10.1 Crear tabla con coordenadas
cSql := "CREATE TABLE ciudades (" \+ ;
"id INT AUTO\_INCREMENT PRIMARY KEY, " \+ ;
"ciudad VARCHAR(20), pt POINT)"oCn:Execute( cSql )
10.2 Insertar coordenadas
TEXT INTO cSql
INSERT INTO ciudades (ciudad, pt) VALUES
("Madrid", POINT( 3.7038, 40.4168 )),
("Paris", POINT( 2.3522, 48.8566 )),
("Londres", POINT( 0.1278, 51.5074 ))
ENDTEXT
oCn:Execute( cSql )
10.3 Funcion de distancia
// Crear funcion SQL para calcular distancia entre dos ciudades
TEXT INTO cSql
CREATE FUNCTION distancia( ciudad1 VARCHAR(20), ciudad2 VARCHAR(20) )
RETURNS DOUBLE
BEGIN
DECLARE p1 POINT;
DECLARE p2 POINT;
SELECT pt INTO p1 FROM ciudades WHERE ciudad \= ciudad1;
SELECT pt INTO p2 FROM ciudades WHERE ciudad \= ciudad2;
RETURN ST\_Distance\_Sphere( p1, p2 );END
ENDTEXT
oCn:Execute( cSql )
// Llamar a la funcion desde FiveWin
? oCn:distancia( "Madrid", "Paris" ) // distancia en metros
11\. Unicode y Codificaciones
11.1 Activar Unicode
FW\_SetUnicode( .t. ) // activar antes de conectar
oCn := maria\_Connect( "localhost", "mibd", "user", "pass" )
11.2 Charset por tabla y por campo
// Tabla con charset utf8
oCn:CreateTable( "textos", { ;
{ "idioma", "C", 15, 0, "latin1" }, ;
{ "contenido","C", 40, 0, "utf8" } }, nil, "utf8" )
11.3 Charset en ImportFromDbf
oCn:ImportFromDbf( "clientes.dbf",,,,,, "utf8\_spanish2\_ci" )
11.4 Triggers para username automatico
TEXT INTO cSql
CREATE TRIGGER tabla\_bi BEFORE INSERT ON mitabla
FOR EACH ROW
BEGIN
SET NEW.username \= SUBSTRING(CONCAT\_WS(",",@os\_user,@pc\_name),1,30);
END
ENDTEXT
oCn:Execute( "DROP TRIGGER IF EXISTS tabla\_bi" )
oCn:Execute( cSql )
12\. Importar DBF a MariaDB
FiveWin permite importar directamente tablas DBF a MariaDB con un solo metodo, preservando la estructura y los datos.
12.1 Importacion basica
oCn := maria\_Connect( "localhost", "fwh", "usuario", "clave" )
oCn:lLogErr := .t. // registrar errores en archivo .log
oCn:ImportFromDbf( "clientes.dbf" )
// Verificar resultado
oRs := oCn:RowSet( "clientes" )
XBROWSER oRs FASTEDIT AUTOSORT
12.2 Con charset especifico
oCn:ImportFromDbf( "clientes.dbf",,,,,, "utf8\_spanish2\_ci" )
12.3 Proceso recomendado de migracion DBF \-\> MariaDB
Conectar a MariaDB con oCn
Llamar a oCn:ImportFromDbf() para cada tabla DBF
Revisar el archivo .log por si hubiera errores de conversion
Verificar los datos importados con XBROWSER oCn:RowSet(cTabla)
Ajustar charsets si hay problemas con caracteres especiales
Ver el ejemplo yunusm.prg incluido en samples\\misc\\ para una migracion completa de una aplicacion DBF a MariaDB.
13\. FWMariaRecord: Edicion de Registro Individual
La clase FWMariaRecord (mariarec.prg) permite leer, editar y guardar un registro individual de MariaDB, ideal para formularios de alta/edicion.
13.1 Crear un FWMariaRecord
// Leer un registro existente
oRec := FWMariaRecord():New( oCn, "clientes", "id \= " \+ cValToChar( nId ) )
// Registro en blanco (para alta)
oRec := FWMariaRecord():New( oCn, "clientes" )
oRec:Blank()
13.2 Acceder y modificar campos
? oRec:nombre // leer campo
oRec:nombre := "Juan Garcia" // modificar campo
oRec:salario := 3500
13.3 Guardar cambios
if oRec:Modified()
oRec:Save()
endif
13.4 Propiedades principales
| Propiedad / Metodo | Descripcion |
|---|---|
| oRec:lValidData | Devuelve .t. si el registro tiene datos validos |
| oRec:RecNo | Numero de registro (0 para registro nuevo) |
| oRec:New(oCn, cTabla, cWhere) | Constructor |
| oRec:Read(cWhere) | Carga un registro segun condicion WHERE |
| oRec:Blank() | Carga un registro en blanco para insercion |
| oRec:Load() | Recarga el registro del servidor |
| oRec:Save() | Guarda los cambios (INSERT o UPDATE segun corresponda) |
| oRec:Modified() | Devuelve .t. si hubo cambios sin guardar |
| oRec:campo | Acceso directo a cada campo como propiedad |
14\. Comparacion FWH vs ADO vs Dolphin
FiveWin permite conectarse a MariaDB/MySQL usando tres bibliotecas diferentes. El ejemplo maria14.prg hace una comparacion de rendimiento en tiempo real.
| Aspecto | FWH Nativo | ADO | TDolphin |
|---|---|---|---|
| Conexion | maria\_Connect() | FW\_DemoDB('ADO') | FW\_DemoDB('DLP') |
| Query | oCn:RowSet(cSql) | FW\_OpenRecordSet(oCn,cSql) | oCn:Query(cSql) |
| Cerrar RS | oRs:Close() | oRs:Close() | oRs:End() |
| Cerrar CN | oCn:Close() | oCn:Close() | oCn:End() |
| Driver extra | No (nativo) | Necesita ODBC | Necesita TDolphin |
| Velocidad | Muy alta | Media | Alta |
| Recomendado | Si (primera opcion) | Solo si ya existe | Compatible |
Para nuevas aplicaciones se recomienda siempre el conector nativo FWH (maria\_Connect). Es el mas rapido, no requiere drivers adicionales y tiene mejor integracion con las clases de FiveWin.
15\. Referencia Rapida de Metodos
Conexion
| Comando | Descripcion |
|---|---|
| maria\_Connect(cStr, lErr) | Conectar al servidor |
| FWCONNECT oCn HOST ... USER ... PASSWORD ... DATABASE ... | Conectar via comando |
| FW\_DemoDB(\[tipo\]) | Conectar al servidor de demo |
| oCn:Close() / oCn:End() | Cerrar conexion |
Consultas
| Comando | Descripcion |
|---|---|
| oCn:RowSet(cSql \[,aParams\]) | Recordset editable |
| oCn:RecSet(cTabla, nRecs) | Recordset paginado para tablas grandes |
| oCn:QueryResult(cSql) | Valor unico (COUNT, SUM, etc.) |
| oCn:Execute(cSql) | Ejecutar SQL sin resultado |
| oCn:ListTables() | Array de tablas |
Tablas
| Comando | Descripcion |
|---|---|
| oCn:TableExists(cTabla) | Verificar si existe |
| oCn:CreateTable(cTabla, aStruct \[,lPK\] \[,cCharset\]) | Crear tabla |
| oCn:DropTable(cTabla) | Eliminar tabla |
| oCn:Insert(cTabla, cCampos, aData) | Insertar registros |
| oCn:ImportFromDbf(cArchivo,...) | Importar desde DBF |
| oCn:TableStructure(cTabla) | Estructura de la tabla |
RowSet
| Metodo | Descripcion |
|---|---|
| oRs:campo | Leer/escribir campo directamente |
| oRs:Fields('campo'):lReadOnly | Poner campo de solo lectura |
| oRs:lAutoAppend := .t. | Habilitar insercion desde browse |
| oRs:SetDefault('campo', val) | Valor por defecto en nuevos registros |
| oRs:SetFilter(cExpr, aParams) | Filtrar registros |
| oRs:ReFilter(aParams) | Re-aplicar filtro con nuevos parametros |
| oRs:ReQuery(\[aParams\]) | Recargar datos |
| oRs:Delete() | Eliminar registro actual |
| oRs:EditBaseRecord(...) | Editar registro completo con dialogo |
| oRs:AddChild(cSQL) | Agregar RowSet hijo |
| oRs:SyncChild() | Sincronizar hijo con posicion actual |
| oRs:Close() / oRs:End() | Cerrar RowSet |
Documentacion adicional y foro de soporte: https://forums.fivetechsupport.com