Cómo usar mysql embebido?
- Armando
- Posts: 3271
- Joined: Fri Oct 07, 2005 8:20 pm
- Location: Toluca, México
- Been thanked: 2 times
- Contact:
Cómo usar mysql embebido?
Amigos:
Necesito de su ayuda para desarrollar una pequeña aplicación usando mysql embebido con objeto
de poder usar la aplicación desde una USB y transportarla por diferentes PCs, nunca acceso remoto.
He buscado en el foro y lo que encontré fue incluir en mi script de compilación la lib libmysqld.lib y
poner la dll libmysqld.dll pero al compilar la aplicación me tira un error.
invalid OMF possibly COFF.
Alguien que me tienda una mano?
Saludos
Necesito de su ayuda para desarrollar una pequeña aplicación usando mysql embebido con objeto
de poder usar la aplicación desde una USB y transportarla por diferentes PCs, nunca acceso remoto.
He buscado en el foro y lo que encontré fue incluir en mi script de compilación la lib libmysqld.lib y
poner la dll libmysqld.dll pero al compilar la aplicación me tira un error.
invalid OMF possibly COFF.
Alguien que me tienda una mano?
Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
-
- Posts: 845
- Joined: Sun Oct 09, 2005 5:36 pm
- Location: la laguna, mexico.
Re: Cómo usar mysql embebido?
Armando,
pegame un grito por skype a ver si te puedo echar la mano..
saludos
pegame un grito por skype a ver si te puedo echar la mano..
saludos
____________________
Paco
Paco
- hebert_j_vargas
- Posts: 99
- Joined: Thu Aug 02, 2012 3:21 pm
Re: Cómo usar mysql embebido?
Amigos, yo tambien estoy interesado en saber como utilizar este metodo de MySQL, podrian compartirlo por este medio.
Saludos.
Saludos.
Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20141106)
FiveWin Version: FWHX 15.01
BCC 5.8.2
FiveWin Version: FWHX 15.01
BCC 5.8.2
- FranciscoA
- Posts: 2163
- Joined: Fri Jul 18, 2008 1:24 am
- Location: Chinandega, Nicaragua, C.A.
Re: Cómo usar mysql embebido?
hebert_j_vargas wrote:Amigos, yo tambien estoy interesado en saber como utilizar este metodo de MySQL, podrian compartirlo por este medio.
Saludos.
+1
Francisco J. Alegría P.
Chinandega, Nicaragua.
Fwxh-MySql-TMySql
Chinandega, Nicaragua.
Fwxh-MySql-TMySql
Re: Cómo usar mysql embebido?
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
- Armando
- Posts: 3271
- Joined: Fri Oct 07, 2005 8:20 pm
- Location: Toluca, México
- Been thanked: 2 times
- Contact:
Re: Cómo usar mysql embebido?
Cristóbal:
Leyendo en el foro veo que hay muchos que mencionan estar usando MySql embebido
pero no sueltan prenda.
Tal vez es como el chiste aquel.
"Va un hombre maduro a consultar al médico y le pide un consejo,
Doctor, que me aconseja?, mis amigos me presumen tener relaciones
5, 6, 7 y hasta 8 veces en una noche, yo que puedo hacer?,
El médico muy tranquilo le dice, pues miéntales usted también!"
Que nadie se ofenda, es solo para relajar la presión del trabajo.
Saludos
PD. Antonio, si crees que me excedí, por favor elimina este post.
Leyendo en el foro veo que hay muchos que mencionan estar usando MySql embebido
pero no sueltan prenda.
Tal vez es como el chiste aquel.
"Va un hombre maduro a consultar al médico y le pide un consejo,
Doctor, que me aconseja?, mis amigos me presumen tener relaciones
5, 6, 7 y hasta 8 veces en una noche, yo que puedo hacer?,
El médico muy tranquilo le dice, pues miéntales usted también!"
Que nadie se ofenda, es solo para relajar la presión del trabajo.
Saludos
PD. Antonio, si crees que me excedí, por favor elimina este post.
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
-
- Posts: 1077
- Joined: Fri Oct 07, 2005 3:33 pm
- Location: Cochabamba - Bolivia
- Has thanked: 1 time
Re: Cómo usar mysql embebido?
yo nunca necesitado instalar mysql en pendrive, mas
ver si ayuda
MYSQL or MariaDB Embedded => http://fivewin.com.br/index.php?/topic/ ... om-o-mysql //copiar la carpeta mysql también funciona bien. No es necesario crear SETUP.exe
instalar Service mysql
e:\PastaAPP\mysql\bin\mysqld --install NameYourService --defaults-file=e:\PastaAPP\mysql\my.ini
inicia Service
net start NameYourService
...
..
.
net stop NameYourService
and Remover Service mysql
e:\PastaAPP\mysql\bin\mysqld --remove NameYourService
ver si ayuda
MYSQL or MariaDB Embedded => http://fivewin.com.br/index.php?/topic/ ... om-o-mysql //copiar la carpeta mysql también funciona bien. No es necesario crear SETUP.exe
instalar Service mysql
e:\PastaAPP\mysql\bin\mysqld --install NameYourService --defaults-file=e:\PastaAPP\mysql\my.ini
inicia Service
net start NameYourService
...
..
.
net stop NameYourService
and Remover Service mysql
e:\PastaAPP\mysql\bin\mysqld --remove NameYourService
Last edited by Sistem on Mon Apr 06, 2015 4:05 pm, edited 1 time in total.
FWH2008 | xHarbour | BCC74 | SQLRDD
-
- Posts: 768
- Joined: Sun Jun 15, 2008 7:47 pm
- Location: Sevilla
- Been thanked: 5 times
- Contact:
Re: Cómo usar mysql embebido?
Si hay pocas respuestas es porque alo mejor se usa poco, de cualquier modo en Eagle1 es muy fácil.
Fijense el trozo de código que hay entre estas dos líneas que siguen;
#ifdef E1_EMBEDDED
#else
el resto es igual para MySQL normal o embebido
Fijense el trozo de código que hay entre estas dos líneas que siguen;
#ifdef E1_EMBEDDED
#else
el resto es igual para MySQL normal o embebido
Code: Select all | Expand
// PROPOSITO.: Ejemplo de mantenimiento simple de una tabla //
//----------------------------------------------------------------------------//
//-- Definiciones ------------------------------------------------------------//
#define B_BOX ( CHR( 218 ) + CHR( 196 ) + CHR( 191 ) + CHR( 179 ) + ;
CHR( 217 ) + CHR( 196 ) + CHR( 192 ) + CHR( 179 ) + " " )
#define ID_CONSUTA 0
#define ID_MODIFICA 1
#define ID_ALTA 2
#define ID_BORRA 3
//-- Includes ----------------------------------------------------------------//
#include "InKey.ch"
#include "Eagle1.ch"
//-- Fuerza el enlazado -----------------------------------------------------//
REQUEST HB_GT_WIN
//-- Modulo principal --------------------------------------------------------//
procedure main()
local cDb := "E1Prueba"
local cTable := "Test"
local oCon, oTb, n
//----------------------------------------------------------------------------
// Desde aquÝ se decide si el sistema usado es el C/S o el embebido
#ifdef E1_EMBEDDED
// Sistema embebido.
// El primer elemento del array de opciones deberÝa ser el nombre
// del programa, actualmente E1 hace lo mismo que MySQL y lo ignora.
// Ojo!!! s¾lo se procesa a partir del segundo.
local aOptions := { "PT05.PRG", "--defaults-file=./test.cnf" }
// El array de grupos contiene los nombres de los grupos que queramos
// procesar dentro del fichero ini declarado
local aGroup := { "op_servidor", "op_cliente" }
//-----------------------------------------------------
// Creamos el objeto Connect e intentamos la conexi¾n:
oCon := TMSEConnect():New( )
oCon:Connect( aOptions, aGroup, cDb )
#else
// Sistema Cliente/Servidor
local cHost := "127.0.0.1"
local cUser := "root"
local cPwd := "root"
//-----------------------------------------------------
// Creamos el objeto Connect e intentamos la conexi¾n:
oCon := TMSConnect():New()
oCon:Connect( cHost, cUser, cPwd, cDb,,, CLIENT_MULTI_STATEMENTS )
#endif
// Hasta aquÝ. A paritir de aquÝ no se cambia ni una lÝnea de c¾digo
//----------------------------------------------------------------------------
SET DATE FORMAT TO "DD/MM/YYYY"
cls
if oCon:lConnected
// Control de errores automßtico
oCon:SetAutoError( .t. )
// Creo el objeto Tabla con DataField
oTb := TMyTable( cTable ):New( oCon, cTable )
// Establezco el relleno de espacios (menos optimo)
oTb:SetReadPADAll( .t. )
// Prueba de tiny como logicos:
oTb:SetTinyAsLogical( .t. )
// Abro la tabla
if oTb:Open()
MyMsgInfo( oCon:oDataBase:ShowCreate(), "Creaci¾n de " + oCon:oDataBase:cName )
MyMsgInfo( oTb:ShowCreate(), "Estructura de " + oTb:cName )
// Si no hay registros insertamos uno para que funcione el Browse
Alert( "Estado actual de la conexion...;-------------------------------;;";
+ oCon:GetStat() )
// Abrimos el Browse
GestBrw( oTb )
else
// Esta es la manera de poner un mensaje de error propio y
// del generado por Eagle1 cuando ponemos SetAutoError( .f. )
Alert( ";Mi mensaje de error:;No se pudo abrir la tabla " + oTb:cName + ;
";;Y el devuelto por Eagle1:;" + oTb:oError:GetError() )
endif
// Prueba de FieldName y FieldPos
n := 6
Alert( "Nombre de la columna " + StrNum( n ) + ": " +;
oTb:FieldName( n ) + ;
";Orden de la columna ZIP: " + ;
StrNum( oTb:FieldPos( "zip" ) ) + " Valor " + ;
oTb:FieldGetByName( "zip" ) + " - " + ;
oTb:FieldGet( oTb:FieldPos( "zip" ) ) )
// Prueba de setWhere
oTb:SetWhere( "first = 'Homer'", .t. ) // Asigna la condici¾n y refresca el reultado
Alert( oTb:cStatement )
// Abrimos el Browse
GestBrw( oTb )
//------------------------------
// Ejemplo SELECT escalar o sea que retorna un valor unico que puede ser
// numerico o alfanumerico
cls
Alert( "Numero de registros hallados con la funcion COUNT( * ): " + ;
StrNum( oCon:GetScalarQuery( "SELECT count( * ) FROM test" ) ) )
Alert( "Ahora la columna NOTES de la primera fila : " + ;
oCon:GetScalarQuery( "SELECT notes FROM test" ) )
// Liberamos la memoria ocupada por el objeto tabla
oTb:Free()
//------------------------------
// METHOD Export( cBakFileName, lCreate, aTables, lDropTable )
// Prueba de backup:
n := Seconds()
oCon:oDataBase:Export() // "MiCopia.sql", .t. )
Alert( "La copia se ha realizado con el nombre: " + ;
oCon:oDataBase:cBakFileName + ";;en " + ;
StrNum( Seconds() - n ) + " segundos" )
//------------------------------
// Este es el restore
//
/*
if oCon:oDataBase:Import( oCon:oDataBase:cBakFileName )
Alert( "La restauracion de la copia se ejecuto ok" )
else
Alert( "Error en la restauracion de la copia..." )
endif
*/
//------------------------------
else
Alert( "No se pudo conectar..." )
endif
// Liberamos la memoria de la conexion
oCon:Free()
return
//-- Modulos auxiliares ------------------------------------------------------//
//----------------------------------------------------------------------------//
// Gestion completa de una tabla MySQL
static procedure GestBrw( oTb )
local oBrw, oCol
local lEnd := .f.
local nKey, n, nFld
oBrw := TBrowseNew( 1, 0, MaxRow() - 1, MaxCol() )
oBrw:colorSpec := "W+/B, N/BG"
oBrw:ColSep := " │ "
oBrw:HeadSep := "─┼─"
oBrw:FootSep := "─┴─"
// Asignamos los bloques de codigo de movimientos del cursor
// de datos
MySetBrowse( oBrw, oTb )
nFld := oTb:FieldCount()
FOR n := 1 TO nFld
oBrw:AddColumn( TBColumnNew( PADL( n, 2, "0" ) + "-" + ;
oTb:FieldType( n ) + "-" + oTb:FieldName( n ), ;
GenCB( oTb, n ) ) )
NEXT
cls
@ 0, 0 SAY PadC( "Ojeando la tabla: " + ;
upper( oTb:cName ), MaxCol() + 1, " " ) COLOR "W+/G+"
@ MaxRow(), 0 SAY "INS" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Altas" COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "ENTER" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Mod." COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "SUPR" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Bajas" COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "F1" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Ayuda" COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "F4" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Orden" COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "F5" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Busca" COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "F6" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Busca ->" COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "ESC" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Salir" COLOR "W+/R+"
while !lEnd
oBrw:ForceStable()
nKey = InKey( 0 )
do case
case nKey == K_ESC // Salir
SetPos( MaxRow(), 0 )
lEnd = .t.
case nKey == K_DOWN // Fila siguiente
oBrw:Down()
case nKey == K_F3
oTb:SetReadPADAll( !oTb:SetReadPADAll() )
oBrw:Configure()
case nKey == K_F4 // Establece el orden
if ElOrden( oTb )
oBrw:goTop()
endif
case nKey == K_F5 // Busca valor en columna
if !BuscaValor( oTb )
Alert( "Valor no encontrado..." )
endif
oBrw:RefreshAll()
case nKey == K_F6 // Busca siguiente columna
if !oTb:FindLikeNext()
Alert( "Valor no encontrado..." )
endif
oBrw:RefreshAll()
case nKey == K_UP // Fila anterior
oBrw:Up()
case nKey == K_LEFT // Va a la columna antrior
oBrw:Left()
case nKey == K_RIGHT // Va a la columna siguiente
oBrw:Right()
case nKey = K_PGDN // Va a la pagina siguiente
oBrw:pageDown()
case nKey = K_PGUP // Va a la pagina antrior
oBrw:pageUp()
case nKey = K_CTRL_PGUP // Va al principio
oBrw:goTop()
case nKey = K_CTRL_PGDN // Va al final
oBrw:goBottom()
case nKey = K_HOME // Va a la primera columna visible
oBrw:home()
case nKey = K_END // Va a la ultima columna visible
oBrw:end()
case nKey = K_CTRL_LEFT // Va a la primera columna
oBrw:panLeft()
case nKey = K_CTRL_RIGHT // Va a la ultima columna
oBrw:panRight()
case nKey = K_CTRL_HOME // Va a la primera pßgina
oBrw:panHome()
case nKey = K_CTRL_END // Va a la ·ltima pßgina
oBrw:panEnd()
case nKey = K_DEL // Borra fila
Borrar( oTb, oBrw )
case nKey = K_INS // Inserta columna
Insertar( oTb, oBrw )
case nKey = K_ENTER // Modifica columna
Modificar( oTb, oBrw )
case nKey == K_F1 // Algunos datos
Alert( "Datos de la tabla " + oTb:cName + ";" + ;
";Registro actual......: " + Str( oTb:RecNo() ) + ;
";Total de registros...: " + Str( oTb:RecCount() ) + ;
";Total de columnas....: " + Str( oTb:FieldCount() ) )
Muestra( oTb:GetRowAsString() )
endcase
end
return
//----------------------------------------------------------------------------//
// Crea los codeblock SETGET de las columnas del browse
static function GenCB( oTb, n )
return( { || oTb:FieldGet( n ) } )
//----------------------------------------------------------------------------//
// Pantalla de datos de la tabla
static function PantMuestra( oTb, nTipo )
local GetList := {}
local cTipo, cId
do case
case nTipo == ID_ALTA
cTipo := "Insertando"
cId := "nuevo"
case nTipo == ID_BORRA
case nTipo == ID_CONSUTA
case nTipo == ID_MODIFICA
cTipo := "Modificando"
cId := StrNum( oTb:Id )
end
SET CURSOR ON
DispBox( 3, 2, 18, 74, B_BOX )
@ 04, 03 SAY cTipo + " registro en tabla " + oTb:cName + " - Numero: " + cId
@ 06, 03 SAY "First....:" GET oTb:First PICTURE "@K"
@ 07, 03 SAY "Last.....:" GET oTb:Last PICTURE "@K"
@ 08, 03 SAY "Street...:" GET oTb:Street PICTURE "@K"
@ 09, 03 SAY "City.....:" GET oTb:City PICTURE "@K"
@ 10, 03 SAY "State....:" GET oTb:State PICTURE "@K"
@ 11, 03 SAY "Zip......:" GET oTb:Zip PICTURE "@K"
@ 12, 03 SAY "Hiredate.:" GET oTb:Hiredate PICTURE "@K"
@ 13, 03 SAY "Married..:" GET oTb:Married PICTURE "@K"
@ 14, 03 SAY "Age......:" GET oTb:Age PICTURE "@K"
@ 15, 03 SAY "Salary...:" GET oTb:Salary PICTURE "@K"
@ 16, 03 SAY "Notes:"
@ 17, 03 GET oTb:Notes PICTURE "@K"
return( GetList )
//----------------------------------------------------------------------------//
// Inserta una fila
static procedure Insertar( oTb, oBrw )
local GetList := {}
local cPant := SaveScreen( 3, 2, 18, 74 )
oTb:Blank()
GetList := PantMuestra( oTb, ID_ALTA )
READ
set cursor off
RestScreen( 3, 2, 18, 74, cPant )
if LastKey() != K_ESC .and. Updated()
if oTb:Insert()
Alert( "Tupla insertada" )
if Alert( "Refresca el Browse?", { "Si", "No" } ) == 1
oTb:Refresh()
oBrw:goBottom()
oBrw:RefreshAll()
endif
endif
endif
return
//----------------------------------------------------------------------------//
// Modifica la fila actual
static procedure Modificar(oTb,oBrw )
local GetList := {}
local nRecNo := oTb:RecNo()
local cPant := SaveScreen( 3, 2, 18, 74 )
oTb:Load()
GetList := PantMuestra( oTb, ID_MODIFICA )
READ
set cursor off
RestScreen( 3, 2, 18, 74, cPant )
if LastKey() != K_ESC .and. Updated()
if oTb:Update()
Alert( StrNum( oTb:AffectedRows() ) + " - tuplas modificadas" )
if Alert( "Refresca el Browse?", { "Si", "No" } ) == 1
oTb:Refresh()
oTb:GoTo( nRecNo )
oBrw:RefreshAll()
endif
endif
endif
return
//----------------------------------------------------------------------------//
// Borra la fila actual
static procedure Borrar( oTb, oBrw )
local nRecNo := oTb:RecNo()
if Alert( "Realmente quieres borrar el registro?", { "Si", "No" } ) == 1
if oTb:Delete( , 1 )
Alert( "Borrado en el servidor" )
if Alert( "Refresca el Browse?", { "Si", "No" } ) == 1
oTb:Refresh()
oTb:GoTo( nRecNo )
oBrw:RefreshAll()
endif
endif
else
Alert( "No se ha borrado..." )
endif
return
//----------------------------------------------------------------------------//
// Establece un nuevo orden de visualizacion
static function ElOrden( oTb )
local i := oTb:FieldCount()
local aFld := Array( i )
local n, lRet
FOR n := 1 TO i
aFld[ n ] := oTb:FieldName( n )
NEXT
DispBox( 5, 9, 10, 25, B_BOX )
i := 0
i := AChoice( 6, 10, 9, 24, aFld )
if lRet := ( i > 0 )
Alert( "Ordenado por la columna: " + StrNum( i ) + " " + oTb:FieldName( i ) )
oTb:SetOrderBy( i,, .t. )
endif
return( lRet )
//----------------------------------------------------------------------------//
// Busca un valor de una columna
static function BuscaValor( oTb )
local GetList := {}
local nCol := 0
local lRet, uVal
DispBox( 5, 5, 8, 75, B_BOX )
@ 6, 10 SAY "Entre numero de columna:" GET nCol PICTURE "@K"
READ
if nCol > 0 .and. nCol <= oTb:FieldCount()
uVal := oTb:FieldGet( nCol )
@ 7, 10 SAY "Entre valor buscado:" GET uVal PICTURE "@K"
READ
// Ojo cuando es tipo caracter (x)Harbour mete espacios hasta el final
// del ancho del campo
uVal := if( ValType( uVal ) == "C", AllTrim( uVal ), uVal )
lRet := oTb:FindLike( nCol, uVal, .t. )
else
lRet := .f.
Alert( "Emtre un n·mero de columna correcto" )
endif
return( lRet )
//----------------------------------------------------------------------------//
______________________________________________________________________________
Sevilla - Andalucía
Sevilla - Andalucía
- Armando
- Posts: 3271
- Joined: Fri Oct 07, 2005 8:20 pm
- Location: Toluca, México
- Been thanked: 2 times
- Contact:
Re: Cómo usar mysql embebido?
Sistem, xManuel:
Muchas gracias por sus respuestas, vamos a intentarlo.
Saludos
Muchas gracias por sus respuestas, vamos a intentarlo.
Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
- hebert_j_vargas
- Posts: 99
- Joined: Thu Aug 02, 2012 3:21 pm
Re: Cómo usar mysql embebido?
xmanuel wrote:Si hay pocas respuestas es porque alo mejor se usa poco, de cualquier modo en Eagle1 es muy fácil.
Fijense el trozo de código que hay entre estas dos líneas que siguen;
#ifdef E1_EMBEDDED
#else
el resto es igual para MySQL normal o embebidoCode: Select all | Expand
// PROPOSITO.: Ejemplo de mantenimiento simple de una tabla //
//----------------------------------------------------------------------------//
//-- Definiciones ------------------------------------------------------------//
#define B_BOX ( CHR( 218 ) + CHR( 196 ) + CHR( 191 ) + CHR( 179 ) + ;
CHR( 217 ) + CHR( 196 ) + CHR( 192 ) + CHR( 179 ) + " " )
#define ID_CONSUTA 0
#define ID_MODIFICA 1
#define ID_ALTA 2
#define ID_BORRA 3
//-- Includes ----------------------------------------------------------------//
#include "InKey.ch"
#include "Eagle1.ch"
//-- Fuerza el enlazado -----------------------------------------------------//
REQUEST HB_GT_WIN
//-- Modulo principal --------------------------------------------------------//
procedure main()
local cDb := "E1Prueba"
local cTable := "Test"
local oCon, oTb, n
//----------------------------------------------------------------------------
// Desde aquÝ se decide si el sistema usado es el C/S o el embebido
#ifdef E1_EMBEDDED
// Sistema embebido.
// El primer elemento del array de opciones deberÝa ser el nombre
// del programa, actualmente E1 hace lo mismo que MySQL y lo ignora.
// Ojo!!! s¾lo se procesa a partir del segundo.
local aOptions := { "PT05.PRG", "--defaults-file=./test.cnf" }
// El array de grupos contiene los nombres de los grupos que queramos
// procesar dentro del fichero ini declarado
local aGroup := { "op_servidor", "op_cliente" }
//-----------------------------------------------------
// Creamos el objeto Connect e intentamos la conexi¾n:
oCon := TMSEConnect():New( )
oCon:Connect( aOptions, aGroup, cDb )
#else
// Sistema Cliente/Servidor
local cHost := "127.0.0.1"
local cUser := "root"
local cPwd := "root"
//-----------------------------------------------------
// Creamos el objeto Connect e intentamos la conexi¾n:
oCon := TMSConnect():New()
oCon:Connect( cHost, cUser, cPwd, cDb,,, CLIENT_MULTI_STATEMENTS )
#endif
// Hasta aquÝ. A paritir de aquÝ no se cambia ni una lÝnea de c¾digo
//----------------------------------------------------------------------------
SET DATE FORMAT TO "DD/MM/YYYY"
cls
if oCon:lConnected
// Control de errores automßtico
oCon:SetAutoError( .t. )
// Creo el objeto Tabla con DataField
oTb := TMyTable( cTable ):New( oCon, cTable )
// Establezco el relleno de espacios (menos optimo)
oTb:SetReadPADAll( .t. )
// Prueba de tiny como logicos:
oTb:SetTinyAsLogical( .t. )
// Abro la tabla
if oTb:Open()
MyMsgInfo( oCon:oDataBase:ShowCreate(), "Creaci¾n de " + oCon:oDataBase:cName )
MyMsgInfo( oTb:ShowCreate(), "Estructura de " + oTb:cName )
// Si no hay registros insertamos uno para que funcione el Browse
Alert( "Estado actual de la conexion...;-------------------------------;;";
+ oCon:GetStat() )
// Abrimos el Browse
GestBrw( oTb )
else
// Esta es la manera de poner un mensaje de error propio y
// del generado por Eagle1 cuando ponemos SetAutoError( .f. )
Alert( ";Mi mensaje de error:;No se pudo abrir la tabla " + oTb:cName + ;
";;Y el devuelto por Eagle1:;" + oTb:oError:GetError() )
endif
// Prueba de FieldName y FieldPos
n := 6
Alert( "Nombre de la columna " + StrNum( n ) + ": " +;
oTb:FieldName( n ) + ;
";Orden de la columna ZIP: " + ;
StrNum( oTb:FieldPos( "zip" ) ) + " Valor " + ;
oTb:FieldGetByName( "zip" ) + " - " + ;
oTb:FieldGet( oTb:FieldPos( "zip" ) ) )
// Prueba de setWhere
oTb:SetWhere( "first = 'Homer'", .t. ) // Asigna la condici¾n y refresca el reultado
Alert( oTb:cStatement )
// Abrimos el Browse
GestBrw( oTb )
//------------------------------
// Ejemplo SELECT escalar o sea que retorna un valor unico que puede ser
// numerico o alfanumerico
cls
Alert( "Numero de registros hallados con la funcion COUNT( * ): " + ;
StrNum( oCon:GetScalarQuery( "SELECT count( * ) FROM test" ) ) )
Alert( "Ahora la columna NOTES de la primera fila : " + ;
oCon:GetScalarQuery( "SELECT notes FROM test" ) )
// Liberamos la memoria ocupada por el objeto tabla
oTb:Free()
//------------------------------
// METHOD Export( cBakFileName, lCreate, aTables, lDropTable )
// Prueba de backup:
n := Seconds()
oCon:oDataBase:Export() // "MiCopia.sql", .t. )
Alert( "La copia se ha realizado con el nombre: " + ;
oCon:oDataBase:cBakFileName + ";;en " + ;
StrNum( Seconds() - n ) + " segundos" )
//------------------------------
// Este es el restore
//
/*
if oCon:oDataBase:Import( oCon:oDataBase:cBakFileName )
Alert( "La restauracion de la copia se ejecuto ok" )
else
Alert( "Error en la restauracion de la copia..." )
endif
*/
//------------------------------
else
Alert( "No se pudo conectar..." )
endif
// Liberamos la memoria de la conexion
oCon:Free()
return
//-- Modulos auxiliares ------------------------------------------------------//
//----------------------------------------------------------------------------//
// Gestion completa de una tabla MySQL
static procedure GestBrw( oTb )
local oBrw, oCol
local lEnd := .f.
local nKey, n, nFld
oBrw := TBrowseNew( 1, 0, MaxRow() - 1, MaxCol() )
oBrw:colorSpec := "W+/B, N/BG"
oBrw:ColSep := " │ "
oBrw:HeadSep := "─┼─"
oBrw:FootSep := "─┴─"
// Asignamos los bloques de codigo de movimientos del cursor
// de datos
MySetBrowse( oBrw, oTb )
nFld := oTb:FieldCount()
FOR n := 1 TO nFld
oBrw:AddColumn( TBColumnNew( PADL( n, 2, "0" ) + "-" + ;
oTb:FieldType( n ) + "-" + oTb:FieldName( n ), ;
GenCB( oTb, n ) ) )
NEXT
cls
@ 0, 0 SAY PadC( "Ojeando la tabla: " + ;
upper( oTb:cName ), MaxCol() + 1, " " ) COLOR "W+/G+"
@ MaxRow(), 0 SAY "INS" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Altas" COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "ENTER" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Mod." COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "SUPR" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Bajas" COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "F1" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Ayuda" COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "F4" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Orden" COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "F5" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Busca" COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "F6" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Busca ->" COLOR "W+/R+"
@ MaxRow(), Col() + 1 SAY "ESC" COLOR "GR+/R+"
@ MaxRow(), Col() + 1 SAY "Salir" COLOR "W+/R+"
while !lEnd
oBrw:ForceStable()
nKey = InKey( 0 )
do case
case nKey == K_ESC // Salir
SetPos( MaxRow(), 0 )
lEnd = .t.
case nKey == K_DOWN // Fila siguiente
oBrw:Down()
case nKey == K_F3
oTb:SetReadPADAll( !oTb:SetReadPADAll() )
oBrw:Configure()
case nKey == K_F4 // Establece el orden
if ElOrden( oTb )
oBrw:goTop()
endif
case nKey == K_F5 // Busca valor en columna
if !BuscaValor( oTb )
Alert( "Valor no encontrado..." )
endif
oBrw:RefreshAll()
case nKey == K_F6 // Busca siguiente columna
if !oTb:FindLikeNext()
Alert( "Valor no encontrado..." )
endif
oBrw:RefreshAll()
case nKey == K_UP // Fila anterior
oBrw:Up()
case nKey == K_LEFT // Va a la columna antrior
oBrw:Left()
case nKey == K_RIGHT // Va a la columna siguiente
oBrw:Right()
case nKey = K_PGDN // Va a la pagina siguiente
oBrw:pageDown()
case nKey = K_PGUP // Va a la pagina antrior
oBrw:pageUp()
case nKey = K_CTRL_PGUP // Va al principio
oBrw:goTop()
case nKey = K_CTRL_PGDN // Va al final
oBrw:goBottom()
case nKey = K_HOME // Va a la primera columna visible
oBrw:home()
case nKey = K_END // Va a la ultima columna visible
oBrw:end()
case nKey = K_CTRL_LEFT // Va a la primera columna
oBrw:panLeft()
case nKey = K_CTRL_RIGHT // Va a la ultima columna
oBrw:panRight()
case nKey = K_CTRL_HOME // Va a la primera pßgina
oBrw:panHome()
case nKey = K_CTRL_END // Va a la ·ltima pßgina
oBrw:panEnd()
case nKey = K_DEL // Borra fila
Borrar( oTb, oBrw )
case nKey = K_INS // Inserta columna
Insertar( oTb, oBrw )
case nKey = K_ENTER // Modifica columna
Modificar( oTb, oBrw )
case nKey == K_F1 // Algunos datos
Alert( "Datos de la tabla " + oTb:cName + ";" + ;
";Registro actual......: " + Str( oTb:RecNo() ) + ;
";Total de registros...: " + Str( oTb:RecCount() ) + ;
";Total de columnas....: " + Str( oTb:FieldCount() ) )
Muestra( oTb:GetRowAsString() )
endcase
end
return
//----------------------------------------------------------------------------//
// Crea los codeblock SETGET de las columnas del browse
static function GenCB( oTb, n )
return( { || oTb:FieldGet( n ) } )
//----------------------------------------------------------------------------//
// Pantalla de datos de la tabla
static function PantMuestra( oTb, nTipo )
local GetList := {}
local cTipo, cId
do case
case nTipo == ID_ALTA
cTipo := "Insertando"
cId := "nuevo"
case nTipo == ID_BORRA
case nTipo == ID_CONSUTA
case nTipo == ID_MODIFICA
cTipo := "Modificando"
cId := StrNum( oTb:Id )
end
SET CURSOR ON
DispBox( 3, 2, 18, 74, B_BOX )
@ 04, 03 SAY cTipo + " registro en tabla " + oTb:cName + " - Numero: " + cId
@ 06, 03 SAY "First....:" GET oTb:First PICTURE "@K"
@ 07, 03 SAY "Last.....:" GET oTb:Last PICTURE "@K"
@ 08, 03 SAY "Street...:" GET oTb:Street PICTURE "@K"
@ 09, 03 SAY "City.....:" GET oTb:City PICTURE "@K"
@ 10, 03 SAY "State....:" GET oTb:State PICTURE "@K"
@ 11, 03 SAY "Zip......:" GET oTb:Zip PICTURE "@K"
@ 12, 03 SAY "Hiredate.:" GET oTb:Hiredate PICTURE "@K"
@ 13, 03 SAY "Married..:" GET oTb:Married PICTURE "@K"
@ 14, 03 SAY "Age......:" GET oTb:Age PICTURE "@K"
@ 15, 03 SAY "Salary...:" GET oTb:Salary PICTURE "@K"
@ 16, 03 SAY "Notes:"
@ 17, 03 GET oTb:Notes PICTURE "@K"
return( GetList )
//----------------------------------------------------------------------------//
// Inserta una fila
static procedure Insertar( oTb, oBrw )
local GetList := {}
local cPant := SaveScreen( 3, 2, 18, 74 )
oTb:Blank()
GetList := PantMuestra( oTb, ID_ALTA )
READ
set cursor off
RestScreen( 3, 2, 18, 74, cPant )
if LastKey() != K_ESC .and. Updated()
if oTb:Insert()
Alert( "Tupla insertada" )
if Alert( "Refresca el Browse?", { "Si", "No" } ) == 1
oTb:Refresh()
oBrw:goBottom()
oBrw:RefreshAll()
endif
endif
endif
return
//----------------------------------------------------------------------------//
// Modifica la fila actual
static procedure Modificar(oTb,oBrw )
local GetList := {}
local nRecNo := oTb:RecNo()
local cPant := SaveScreen( 3, 2, 18, 74 )
oTb:Load()
GetList := PantMuestra( oTb, ID_MODIFICA )
READ
set cursor off
RestScreen( 3, 2, 18, 74, cPant )
if LastKey() != K_ESC .and. Updated()
if oTb:Update()
Alert( StrNum( oTb:AffectedRows() ) + " - tuplas modificadas" )
if Alert( "Refresca el Browse?", { "Si", "No" } ) == 1
oTb:Refresh()
oTb:GoTo( nRecNo )
oBrw:RefreshAll()
endif
endif
endif
return
//----------------------------------------------------------------------------//
// Borra la fila actual
static procedure Borrar( oTb, oBrw )
local nRecNo := oTb:RecNo()
if Alert( "Realmente quieres borrar el registro?", { "Si", "No" } ) == 1
if oTb:Delete( , 1 )
Alert( "Borrado en el servidor" )
if Alert( "Refresca el Browse?", { "Si", "No" } ) == 1
oTb:Refresh()
oTb:GoTo( nRecNo )
oBrw:RefreshAll()
endif
endif
else
Alert( "No se ha borrado..." )
endif
return
//----------------------------------------------------------------------------//
// Establece un nuevo orden de visualizacion
static function ElOrden( oTb )
local i := oTb:FieldCount()
local aFld := Array( i )
local n, lRet
FOR n := 1 TO i
aFld[ n ] := oTb:FieldName( n )
NEXT
DispBox( 5, 9, 10, 25, B_BOX )
i := 0
i := AChoice( 6, 10, 9, 24, aFld )
if lRet := ( i > 0 )
Alert( "Ordenado por la columna: " + StrNum( i ) + " " + oTb:FieldName( i ) )
oTb:SetOrderBy( i,, .t. )
endif
return( lRet )
//----------------------------------------------------------------------------//
// Busca un valor de una columna
static function BuscaValor( oTb )
local GetList := {}
local nCol := 0
local lRet, uVal
DispBox( 5, 5, 8, 75, B_BOX )
@ 6, 10 SAY "Entre numero de columna:" GET nCol PICTURE "@K"
READ
if nCol > 0 .and. nCol <= oTb:FieldCount()
uVal := oTb:FieldGet( nCol )
@ 7, 10 SAY "Entre valor buscado:" GET uVal PICTURE "@K"
READ
// Ojo cuando es tipo caracter (x)Harbour mete espacios hasta el final
// del ancho del campo
uVal := if( ValType( uVal ) == "C", AllTrim( uVal ), uVal )
lRet := oTb:FindLike( nCol, uVal, .t. )
else
lRet := .f.
Alert( "Emtre un n·mero de columna correcto" )
endif
return( lRet )
//----------------------------------------------------------------------------//
xManuel, ¿Quieres decir que con este código solo debo incluir el DLL Libmysqld y mi aplicación no necesitará de un servidor Mysql?,
Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20141106)
FiveWin Version: FWHX 15.01
BCC 5.8.2
FiveWin Version: FWHX 15.01
BCC 5.8.2
Re: Cómo usar mysql embebido?
Por si ayuda
Existe el Enigma Virtual Box el cual nos permite adjuntar archivos a nuestro EXE como DLL, OCX y otros.
Saludos,
Adhemar
Existe el Enigma Virtual Box el cual nos permite adjuntar archivos a nuestro EXE como DLL, OCX y otros.
Saludos,
Adhemar
Saludos,
Adhemar C.
Adhemar C.
-
- Posts: 768
- Joined: Sun Jun 15, 2008 7:47 pm
- Location: Sevilla
- Been thanked: 5 times
- Contact:
Re: Cómo usar mysql embebido?
Así es hebert_j_vargas
Con un exe y la DLL te puedes permitir el lujo de hacer una instalación completa sin tener que ir tú personalmente a instalar tu programa...
Todo está autocontenido
![Mr. Green :mrgreen:](./images/smilies/icon_mrgreen.gif)
![Very Happy :D](./images/smilies/icon_biggrin.gif)
Con un exe y la DLL te puedes permitir el lujo de hacer una instalación completa sin tener que ir tú personalmente a instalar tu programa...
Todo está autocontenido
![Shocked :shock:](./images/smilies/icon_eek.gif)
![Mr. Green :mrgreen:](./images/smilies/icon_mrgreen.gif)
______________________________________________________________________________
Sevilla - Andalucía
Sevilla - Andalucía
-
- Posts: 768
- Joined: Sun Jun 15, 2008 7:47 pm
- Location: Sevilla
- Been thanked: 5 times
- Contact:
Re: Cómo usar mysql embebido?
Por cierto allá en el 2008 publiqué una entrada en mi viejo blog que versaba sobre este tema... ahora Eagle1 es más fácil y potente jeje
https://lacolinadelloco.blogia.com/
https://lacolinadelloco.blogia.com/
______________________________________________________________________________
Sevilla - Andalucía
Sevilla - Andalucía
- hebert_j_vargas
- Posts: 99
- Joined: Thu Aug 02, 2012 3:21 pm
Re: Cómo usar mysql embebido?
Excelente xmanuel, voy a probarlo!!!
Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20141106)
FiveWin Version: FWHX 15.01
BCC 5.8.2
FiveWin Version: FWHX 15.01
BCC 5.8.2