En primer lugar no es una clase para acceder sólo a MySQL si no que además lo podrás hacer también a SQLite, Postgres, Firebird, Oracle y a otras muchas usando ODBC.
Todas ellas accediendo de manera nativa.
El 100% de las clases están hechas en lenguaje C por lo que son muy rápidas y robustas evitando la MV de Harbour.
Tienes la posibilidad usar sentencias preparadas en el lado del servidor por lo que el tráfico en la red es mínimo y, el que hay, será binario, imposible de inyectar código malicioso.
Además te garantizo que si usas SQL estándar podrás tener un mismo programa preparado para todas las bases de datos sólo cambiando una línea
, esta:
- Code: Select all Expand view
oDb := THDO():new( "sqlite" )
Cambiando "sqlite" por "mysql" tendrás un programa compatible con uno u otro gestor de bases de datos.
Y sobre todo he cuidado la velocidad, ¿has probado el programa que he puesto? los 500 registros los pasa instantáneamente el tiempo de retardo es el de repintado del contador!!!
Por si no te lo has descargado, este es el código para que veas lo fácil que es usarlo:
- Code: Select all Expand view
#include "hdo.ch"
//------------------------------------------------------------------------------
// Programa principal
procedure main()
local oDb, e
local cCreaTabla := ;
"CREATE TABLE test ( " + ;
"idreg INTEGER PRIMARY KEY," + ;
"first TEXT," + ;
"last TEXT," + ;
"street TEXT," + ;
"city TEXT," + ;
"state TEXT," + ;
"zip TEXT," + ;
"hiredate TEXT," + ;
"married INTEGER," + ;
"age INTEGER," + ;
"salary REAL," + ;
"notes TEXT );"
oDb := THDO():new( "sqlite" )
if oDb:connect( "demo.db" )
msg( "demo.db abierta" )
try
oDb:exec( cCreaTabla )
msg( "Traspaso de datos..." )
traspasa( oDb )
catch e
eval( errorblock(), e )
end
endif
oDb:disconnect()
msg( "demo.db cerrada" )
return
//------------------------------------------------------------------------------
// Usa sentencias preparadas en el lado del servidor y transacciones.
procedure traspasa( oDb )
local n := 0
local oInsert
local first, last, street, city, state, zip, hiredate, married, age, salary, notes
local cSentencia := "INSERT INTO test ( first, last, street, city, state, zip, " + ;
"hiredate, married, age, salary, notes ) " + ;
"VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? );"
if file( "test.dbf" )
use test new
oInsert := oDb:prepare( cSentencia ) // Crea el objeto y prepara la sentencia
// Vincula las variables harbour con cada una de las "?" por su posicion
oInsert:bindParam( 1, @first )
oInsert:bindParam( 2, @last )
oInsert:bindParam( 3, @street )
oInsert:bindParam( 4, @city )
oInsert:bindParam( 5, @state )
oInsert:bindParam( 6, @zip )
oInsert:bindParam( 7, @hiredate )
oInsert:bindParam( 8, @married )
oInsert:bindParam( 9, @age )
oInsert:bindParam( 10, @salary )
oInsert:bindParam( 11, @notes )
oDb:beginTransaction()
while test->( !eof() )
first := test->first
last := test->last
street := test->street
city := test->city
state := test->state
zip := test->zip
hiredate := dtos( test->hiredate )
married := if( test->married, 1, 0 )
age := test->age
salary := test->salary
notes := test->notes
oInsert:execute()
@ 10, 10 say str( ++n )
test->( dbskip( 1 ) )
end
oDb:commit()
oInsert:free()
else
msg( "Fichero no encontrado -> test.dbf" )
endif
return
//------------------------------------------------------------------------------
Cualquier duda estoy aquí para responder...