Cómo usar mysql embebido?

Cómo usar mysql embebido?

Postby Armando » Mon Mar 30, 2015 4:03 pm

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
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
User avatar
Armando
 
Posts: 3084
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Cómo usar mysql embebido?

Postby Francisco Horta » Mon Mar 30, 2015 6:22 pm

Armando,

pegame un grito por skype a ver si te puedo echar la mano..

saludos
____________________
Paco
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Re: Cómo usar mysql embebido?

Postby hebert_j_vargas » Tue Mar 31, 2015 3:36 pm

Amigos, yo tambien estoy interesado en saber como utilizar este metodo de MySQL, podrian compartirlo por este medio.


Saludos.
Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20141106)
FiveWin Version: FWHX 15.01
BCC 5.8.2
User avatar
hebert_j_vargas
 
Posts: 99
Joined: Thu Aug 02, 2012 3:21 pm

Re: Cómo usar mysql embebido?

Postby FranciscoA » Tue Mar 31, 2015 3:50 pm

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
User avatar
FranciscoA
 
Posts: 2114
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Cómo usar mysql embebido?

Postby cnavarro » Tue Mar 31, 2015 7:04 pm

Yo tambien estoy interesado
Puede servir esto?
http://www.forosdelweb.com/f96/compilan ... ql-543492/
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
User avatar
cnavarro
 
Posts: 6504
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Cómo usar mysql embebido?

Postby Armando » Tue Mar 31, 2015 7:20 pm

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.
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
User avatar
Armando
 
Posts: 3084
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Cómo usar mysql embebido?

Postby Marcelo Via Giglio » Tue Mar 31, 2015 9:29 pm

Holas,

tDolphin lo permite utilizar

saludos

Marcelo
Marcelo Via Giglio
 
Posts: 1051
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Cómo usar mysql embebido?

Postby Sistem » Wed Apr 01, 2015 9:50 am

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
Last edited by Sistem on Mon Apr 06, 2015 4:05 pm, edited 1 time in total.
FWH2008 | xHarbour | BCC74 | SQLRDD
User avatar
Sistem
 
Posts: 226
Joined: Sun May 13, 2012 7:52 am

Re: Cómo usar mysql embebido?

Postby xmanuel » Wed Apr 01, 2015 2:25 pm

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

Code: Select all  Expand view

//  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
xmanuel
 
Posts: 756
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: Cómo usar mysql embebido?

Postby Armando » Wed Apr 01, 2015 3:59 pm

Sistem, xManuel:

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
User avatar
Armando
 
Posts: 3084
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Cómo usar mysql embebido?

Postby hebert_j_vargas » Wed Apr 01, 2015 6:08 pm

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 embebido

Code: Select all  Expand view

//  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
User avatar
hebert_j_vargas
 
Posts: 99
Joined: Thu Aug 02, 2012 3:21 pm

Re: Cómo usar mysql embebido?

Postby acuellar » Wed Apr 01, 2015 6:28 pm

Por si ayuda

Existe el Enigma Virtual Box el cual nos permite adjuntar archivos a nuestro EXE como DLL, OCX y otros.

Saludos,

Adhemar
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1594
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Cómo usar mysql embebido?

Postby xmanuel » Wed Apr 01, 2015 8:21 pm

Así es hebert_j_vargas :D
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 :shock: :mrgreen:
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 756
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: Cómo usar mysql embebido?

Postby xmanuel » Wed Apr 01, 2015 8:33 pm

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/
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 756
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: Cómo usar mysql embebido?

Postby hebert_j_vargas » Thu Apr 02, 2015 11:59 pm

Excelente xmanuel, voy a probarlo!!!
Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20141106)
FiveWin Version: FWHX 15.01
BCC 5.8.2
User avatar
hebert_j_vargas
 
Posts: 99
Joined: Thu Aug 02, 2012 3:21 pm

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 43 guests