Manejar multi conexiones

243 views
Skip to first unread message

Francisco ji

unread,
Jul 31, 2013, 1:29:52 PM7/31/13
to publice...@googlegroups.com
Saludos estimados.

Quisiera ver si alguien tiene experiencia y como lo manejan el poder manejar en un sistema 3 sgbd, ej. Firebird, SqlSever y Mysql.

Esto sería elegible en el sistema, y de ahi en adelante, el sistema tome la base de datos que se eligío (lógicmanete en cada instalación se eligirá la base de datos a utilizar)

Estoy pensando manejar condiciones tal vez con un CASE cada vez que arme la cadena para solicitar información a la base de datos.

Espero sus comentarios, de antemano, gracias.

Víctor Hugo Espínola Domínguez

unread,
Jul 31, 2013, 1:50:49 PM7/31/13
to publicesvfoxpro
Hola Francisco

Es posible implementar tu idea, pero tiene un costo: Debes renunciar al uso de Stored procedures y Triggers porque los lenguajes no están estandarizados.

Para la capa de negocios debes usar una clase basada en Cursor adapter. Una dificultad con la que tendrás que lidiar es el control de transacciones pues el comando para iniciarlas tampoco está estandarizado.

Puedes bajar algunos ejemplos de los siguientes enlaces:




Saludos,
Víctor.

Luis Mata

unread,
Jul 31, 2013, 2:00:55 PM7/31/13
to publice...@googlegroups.com
Un lio, funcionalmente un problema, pero conectarse? no se que problemas encuentras, un combo con una simple tabla con los datos de conexión y listo.

Jairo Miranda

unread,
Jul 31, 2013, 2:10:21 PM7/31/13
to publice...@googlegroups.com

MALKASOFT ADPI: http://www.developervfp.blogspot.com/

unread,
Jul 31, 2013, 5:30:34 PM7/31/13
to publice...@googlegroups.com, fiba...@hotmail.com
Hola es muy sencillo manejar lo que dices yo tengo una herramienta que trabaja sin problema con cualquier motor de base de datos, si necesita asesoramiento envíame un correo o visita mi blog para que tengas una idea de como hacerlo.


Pd.: Descargate mi grilla que tiene multiples funciones como filtrar, multiseleccion, búsqueda, etc del siguiente link http://www.developervfp.blogspot.com/p/gridlibre-v35.html. Ahora también puedes bajarte mi ultima herramienta Busqueda Incremental con un TEXTBOX http://developervfp.blogspot.mx/p/busqueda-incremental-con-un-textbox.html  las herramientas viene con código fuente, ojo no hacer mal uso por favor. 


Saludos; 


Ing. Russvell Jesus Soto Gamarra 
San Juan del Rio - Queretaro - Mexico 
Nextel.: 52*133750*16
rycjesusrj @ hotmail.com
Framework Multi-conexion version 6.0 (nueva)

Alfonso Ramirez Diaz

unread,
Jul 31, 2013, 9:44:24 PM7/31/13
to publice...@googlegroups.com, fiba...@hotmail.com
No es muy complicado, yo uso varios motores que puedo elegir al momento de instalar mi software el cual se conecta la primera vez y crea toda la estructura en el motor seleccionado.

Francisco ji

unread,
Jul 31, 2013, 11:22:35 PM7/31/13
to publice...@googlegroups.com
Gracias, revice tu blog, pero no veo donde descargar el framework que comentas.


Date: Wed, 31 Jul 2013 14:30:34 -0700
From: rycj...@gmail.com
To: publice...@googlegroups.com
CC: fiba...@hotmail.com
Subject: [vfp] Re: Manejar multi conexiones

Francisco ji

unread,
Jul 31, 2013, 11:25:39 PM7/31/13
to publice...@googlegroups.com
Gracias, revisaré los enlaces.

Luis, la situación no es hacer solo las conexiones, es fácil como comentas, el detalle son las consultas para cada motor de base de datos.

De cualquier forma, reviso lo que me indican, gracias.


From: sandrae...@gmail.com
To: publice...@googlegroups.com
Subject: RE: [vfp] Manejar multi conexiones
Date: Wed, 31 Jul 2013 13:10:21 -0500

Francisco ji

unread,
Jul 31, 2013, 11:29:58 PM7/31/13
to publice...@googlegroups.com
Hola Alfonso, no creo que sea complicado como comentas, lo sé.
La pregunta practicamente es que me aconsejaran o dieran algun ejemplo de como hacerlo, tengo en mente algunas, epro siempre las diferentes experiencias enrriquecen.

Saludos.



Date: Wed, 31 Jul 2013 18:44:24 -0700
From: aerd...@gmail.com

To: publice...@googlegroups.com
CC: fiba...@hotmail.com
Subject: [vfp] Re: Manejar multi conexiones

elkin dario uribe torres

unread,
Aug 1, 2013, 9:05:17 AM8/1/13
to publice...@googlegroups.com
En mi caso lo que hice para poder manejar algo parecido a lo que tu expresas sobre un programa ya elaborado y listo fue.

- Modificar en el PRG el tipo de conexion y almacenarla ej.

***Programa conectarservidor
DO case
CASE baseconexion = "VFP"
DO conectarservidorvfp
CASE baseconexion = "MSSQL"
DO conectarsql
CASE baseconexion = "MYSQL"
DO conectarservidorMysql
OTHERWISE 
ENDCASE

- Modificar los formularios para utilizar comandos Sql comunes a los motores (hay que investigar), al momento de armar la instruccion y mandarla al servidor este con base en la variable almacenada sabrá a que motor llamar y mandar la instruccion Ej

LcFactura = SUBSTR(factura,1,5)

set textmerge on TO memvar lcStringSQL noshow
\select * from detfacturas where prefijo =
\\'<<LcFactura>>'
\ and numero = 
\\'<<LcFactura>>'
\ order by NUMCUOTA 
set textmerge to
DO conectarservidor
STORE sqlexec(controlador,lcStringSQL,'detfacturas') TO a
SQLDISCONNECT(0)

En los casos que los comandos difieran un poco hay que armar la instruccion antes de enviarla al servidor, preguntando antes por la variable 'baseconexion' almacenada en el programa principal.

- No utilice procedimientos almacenados, no he podido entenderlos y seria casi imposible utilizarlo en este caso estoy totalmente de acuerdo con lo expresado por Victor Hugo Espínola.

Saludos

Elkin Uribe



Andrés Oscar Gimbatti

unread,
Aug 1, 2013, 9:17:35 AM8/1/13
to publice...@googlegroups.com, fiba...@hotmail.com
yo cree funciones que me pasan los comandos al motor de base de datos, teniendo una variable o propiedad con el motor de base de datos que estas usando, dentro de la función metes un case con el comando especifico para cada boton.
Ejemplo para empezar la transaccion

if not comenzartrans()
  dio error
  return
endif


prcedure comenzartrans

do case
 case motor="pos"
  lok = sqlexec(conexion, "BEGIN")
 case motor="my"
  lok = sqlexec(conexion, "comando en mysql")
endcase

if lok < 0
  dio error la consulta
endif

return iif(lok<0,.f.,.t.)

asi tengo para las consultas, crear cursores con la estructura de las tablas vacias, insertar registros, modificar registros, cancelar transaccion, aceptar transaccion, la fecha y hora del motor de base de datos, etc etc

espero te sirva la idea

saludos

Francisco ji

unread,
Aug 1, 2013, 11:06:19 AM8/1/13
to publice...@googlegroups.com
Elkin, agradezco tu consejo, presisamente es como tenia pensado esto, distinguir la base de datos seleccionada y en base a este valor crear las consultas.


Date: Thu, 1 Aug 2013 08:05:17 -0500
Subject: Re: [vfp] Manejar multi conexiones
From: eduri...@gmail.com
To: publice...@googlegroups.com

Luis Mata

unread,
Aug 1, 2013, 11:08:50 AM8/1/13
to publice...@googlegroups.com
Un consulta, la idea que tienes es en las bases de datos solo tener datos? osea no aprovechar los jobs, triguers, procedimientos almacenados, funciones, permisos, validaciones.
y hacerlo todo en el front end? osea toda la codificacion va a ir en el FrontEnd?
 
Sent: Thursday, August 01, 2013 10:06 AM
Subject: RE: [vfp] Manejar multi conexiones
 

Francisco ji

unread,
Aug 1, 2013, 11:12:16 AM8/1/13
to publice...@googlegroups.com
No Luis, actualmente tengo un sistema que esta en el 90% en Firebird, utilizando triggers, SP, Vistas, generadores, etc.

Este mismo sistema, quisiera tener la opción para manejarlo en SqlServer, MySql, Maria, etc.

Se perfectamente que cada SGDB tiene su forma especifica de manejarlas, es por eso que era la pregunta de como lo manejaban las personas que manejan diferentes bases de datos del mismo sistema.



Subject: Re: [vfp] Manejar multi conexiones
Date: Thu, 1 Aug 2013 10:08:50 -0500

Douglas Sánchez

unread,
Aug 1, 2013, 5:25:37 PM8/1/13
to publice...@googlegroups.com
Yo tengo una clase y segun la necesidad pues se me hizo facil asi:


Lparameters typebackend
SYS(987,.T.)
SET VARCHARMAPPING OFF   
CURSORSETPROP("MapVarChar", .F., 0)   
CURSORSETPROP("MapBinary",  .T., 0)
Local iTipo As Integer
iTipo = typebackend
Do Case
Case iTipo=1
    *This.verificamysql()
    This.openmysql()
Case iTipo=2
    This.verificasqlserver()
    This.opensqlserver()
Case iTipo=3
    This.verificaoracle()
    This.openoracle()
Otherwise
    =Messagebox("Driver de Conexión no Soportado...",0+16,"Advertencia")
    Return .F.
Endcase

Al rato esto te da alguna idea, verificar es si esta instalado el driver odbc de cada uno.

Saludes

Douglas


--
Ing. Douglas Sánchez Guillén
      Consultor Informatico
Claro: 505 88495476

Francisco ji

unread,
Aug 1, 2013, 8:34:21 PM8/1/13
to publice...@googlegroups.com
Gracias Douglas, supongo que el mismo esquema se hará para cada consulta que se haga a la base de datos.

Te agradzco el consejo.


Date: Thu, 1 Aug 2013 15:25:37 -0600

Subject: Re: [vfp] Manejar multi conexiones

Víctor Hugo Espínola Domínguez

unread,
Aug 1, 2013, 8:54:10 PM8/1/13
to publicesvfoxpro
Hola Francisco

Si usaras cursor adapter, sólo para la conexión y las transacciones te preocuparías por el origen de datos, en todo lo demás se usa una sola instrucción.

En el load de la clase formulario abm:

With This
If Type( "_Screen.oApp" ) = "O"
If Pemstatus( _Screen.oApp, "AccesMode", 5 )
.AccesMode  = _Screen.oApp.AccesMode
.MyDatabase = _Screen.oApp.MyDatabase
Endif
Endif
If Upper( .AccesMode ) == "DBF"
.oCaMainTable = Createobject( [MiCursorAdapter], "NATIVE", .MyDatabase )
Else
.oCaMainTable = Createobject( [MiCursorAdapter], "ODBC", Filetostr( "Datos\Conexion.cnx" ) )
Endif
.crsAlias  = "crs" + .MainTable
.oCaMainTable.CrearCursor( .MainTable, .crsAlias, .KeyField, .T., .T. )
.nConexion = .oCaMainTable.DataSource
Endwith

Si no usarás dbfs entonces es más simple aún:
With This
.oCaMainTable = Createobject( [MiCursorAdapter], "ODBC", Filetostr( "Datos\Conexion.cnx" ) )
.crsAlias  = "crs" + .MainTable
.oCaMainTable.CrearCursor( .MainTable, .crsAlias, .KeyField, .T., .T. )
.nConexion = .oCaMainTable.DataSource
Endwith

El archivo de texto "Conexion.cnx" contiene el string de conexión, para Sql Server 2005 Express tiene:
Driver={SQL Server};Server=LocalHost\sqlexpress;Database=VheDat;Trusted_Connection=yes;

En el método grabar:
If Upper( .cOrigenDatos ) == "DBF"
Begin Transaction
Else
SQLExec( .nConexion, 'BEGIN TRANSACTION' )
SQLSetprop( .nConexion, 'Transactions', 2 )
Endif
Aquí es donde hay diferencias entre algunos SGBD.

Saludos,
Víctor.

Francisco ji

unread,
Aug 1, 2013, 11:52:42 PM8/1/13
to publice...@googlegroups.com
Gracias Victor, el detalle que no manejo cursor adapter, y la aplicación ya la tengo en un 90%.

Te agradezco.


Date: Thu, 1 Aug 2013 20:54:10 -0400

Subject: Re: [vfp] Manejar multi conexiones

Víctor Hugo Espínola Domínguez

unread,
Aug 2, 2013, 12:23:42 AM8/2/13
to publicesvfoxpro
Hola Francisco

No es ningún drama que no uses cursor adapter, igual puedes implementar una clase para el manejo de datos y esta clase debe ser el puente entre tus formularios y el SGBD.

Puedes bajar unos ejemplos del siguiente enlace:  http://www.mediafire.com/download/6jkkux4kfs77vci/ClientServerVFP.rar

Fijate en la carpeta "ThreeTierSPT", ahí está la clase "DataTier", creada por Les Pinter y con algunas modificaciones agregadas por mí.

También está incluido el excelente aporte de Walter Ojeda: "SqlDemo"

Saludos,
Víctor.

Francisco ji

unread,
Aug 2, 2013, 10:11:43 AM8/2/13
to publice...@googlegroups.com
Victor, gracias, estudiaré la clase, que seguramente me servirá.


Date: Fri, 2 Aug 2013 00:23:42 -0400

Antonio Meza

unread,
Aug 2, 2013, 11:47:57 AM8/2/13
to publice...@googlegroups.com, fiba...@hotmail.com
Hola Francisco!!

Y como manejas actualmente o con que motor de base de datos tienes tu sistema, ya que comentas que lo tienes en un 90%, te lo pregunto porque veo que no manejas casi nada de lo que te dicen aquí, para poder darte una pequeña opinión mas acertada en base a lo que manejas.

saludos
Antonio Meza

Francisco ji

unread,
Aug 2, 2013, 12:32:07 PM8/2/13
to publice...@googlegroups.com
Que tal Antonio, en mi primer correo expuse que es en Firebird.
El detalle es que lo empece a hacer solo para manejar una base de datos, en este caso Firebird, pero ahora quiero tenerlo diponible para varias bases de datos.

Gracias por el interes.






Date: Fri, 2 Aug 2013 08:47:57 -0700
From: solv...@gmail.com
To: publice...@googlegroups.com
CC: fiba...@hotmail.com

Antonio Meza

unread,
Aug 2, 2013, 12:38:58 PM8/2/13
to publice...@googlegroups.com, fiba...@hotmail.com
Ok, pero que usas para manejar los datos, sqlexec, cursoradaptaer, vistas remotas? y si tienes un ejemplo de como agregas un registro para ver como lo usas.

saludos
Reply all
Reply to author
Forward
0 new messages