FoxyDb, apoyo para agregar PostgreSql y SqlServer

379 views
Skip to first unread message

Antonio Meza

unread,
Jun 12, 2015, 6:53:00 PM6/12/15
to publice...@googlegroups.com
Hola!!

Quienes deseen contribuir desinteresadamente proporcionando la siguiente información para poder agregar estos 2 servidores de base de datos en FoxyDb, y quien pueda realizar las pruebas una vez que los integre sería fantástico.

La librería ya cuenta con varias funciones y propiedades en los cuales solo hay que agregar la forma en que trabaja cada servidor para las siguientes situaciones, si hay una mejor propuesta a los valores de ejemplo y documentación al respecto seria excelente.

Driver ODBC que se requiere para realizar la conexión
o   Mysql / MariaDb
§  {MySQL ODBC 5.1 Driver}
§  {MySQL ODBC 3.51 Driver}
o   FireBird
§  {Firebird/InterBase(r) driver}
o   SqlServer
§  ¿?
o   PostgreSql
§  ¿?

Puerto Predeterminado de cada servidor
o   Mysql / MariaDb
§  3006
o   FireBird
§  3050
o   SqlServer
§  ¿?
o   PostgreSql
§  ¿?

Fecha vacías, si se necesita enviar fechas vacías para que el servidor las acepte FoxyDb verifica si hay un campo Fecha y si esta vacío lo reemplaza por el valor indicado según el servidor, ejemplo 
replace tabla.campo_fecha with “0000-00-00”
o   Mysql / MariaDb
§  0000-00-00
o   FireBird
§  Null
o   SqlServer
§  ¿?
o   PostgreSql
§  ¿?

Iniciar Transacciones de Solo Lectura es decir el comando SQL necesario para que el servidor se prepare la transacción de solo lectura, ejemplo: 
SqlExec(handle,“SET TRANSACTION READ ONLY”)
o   Mysql / MariaDb
§  SET TRANSACTION READ ONLY
o   FireBird
§  SET TRANSACTION READ ONLY SNAPSHOT WAIT
o   SqlServer
§  ¿?
o   PostgreSql
§  ¿?

Iniciar transacción de lectura y escritura
o   Mysql / MariaDb
§  SET TRANSACTION ISOLATION LEVEL READ COMMITTED
o   FireBird
§  SET TRANSACTION READ WRITE READ COMMITTED WAIT
o   SqlServer
§  ¿?
o   PostgreSql
§  ¿?

Obtener el ultimo valor insertando en un campo Primary Key Autoincrementable, no enviar ejemplos usando MAX() eso no funciona en red, en el caso de mysql o mariadb seria así
SqlExec(handle,“SELECT LAST_INSERT_ID()”)
o   Mysql / MariaDb
§  SELECT LAST_INSERT_ID()
o   FireBird
§  Insert into tabla (campoX) values (?valor) RETURNING campoid
o   SqlServer
§  ¿?
o   PostgreSql
§  ¿?

Generar un UUID, ejemplo:
SqlExec(handle,“SELECT UUID()”)
o   Mysql / MariaDb
§  SELECT UUID()
o   FireBird
§  SELECT UUID_TO_CHAR(GEN_UUID()) FROM RDB$DATABASE
o   SqlServer
§  ¿?
o   PostgreSql
§  ¿?

Obtener la versión del servidor, ejemplo:
SqlExec(handle,“SELECT VERSION()”)
o   Mysql / MariaDb
§  SELECT VERSION()
o   FireBird
§  SELECT RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION') FROM RDB$DATABASE
o   SqlServer
§  ¿?
o   PostgreSql
§  ¿?

Bloqueo de Registros, ejemplo
SqlExec(handle,“Select * From tabla FOR UPDATE”)
o   Mysql / MariaDb
§  Select * From tabla FOR UPDATE
o   FireBird
§  Select * From tabla WITH LOCK
o   SqlServer
§  ¿?
o   PostgreSql
§  ¿?

Cambiar de base de datos dentro del servidor, ejemplo
SqlExec(handle,“Use nombreDb”)
o   Mysql / MariaDb
§  USE nombredb
o   FireBird
§  ¿?
o   SqlServer
§  ¿?
o   PostgreSql
§  ¿?

Estos son los datos que requiero para poder integrar estos dos motores de base de datos en FoxyDb.
Gracias por su apoyo, ayuda y recomendaciones.

HernanCano

unread,
Jun 12, 2015, 10:26:34 PM6/12/15
to publice...@googlegroups.com, solv...@gmail.com

Hola, Antonio.

Quizá en  https://www.ConnectionStrings.com/PostgreSQL/  puedas encontrar datos que te puedan interesar.


mpulla

unread,
Jun 12, 2015, 11:15:45 PM6/12/15
to publice...@googlegroups.com, solv...@gmail.com

Hola Antonio

Para Sql Server 2008 a 2012 (No he probado Sql Server 2014)
ODBC Sql Server Native Client 11.0

Puerto Predeterminado
1433

Fechas
Sql Server no admite fechas vacias tendría que se NULL

Transacciones de Lectura escritura.

SET TRANSACTION ISOLATION LEVEL READ COMMITTED (Default no te permite lecturas sucias, pero si lecturas fantasmas) si quires un mejor nivel de aislamiento tienes REPEATABLE READ, SNAPSHOT, SERIALIZABLE

Ultimo valor insertado Scope_identity

Generar UUID Select NEWID ( )

Select *
From  App.secuencia WITH (HOLDLOCK);

Use midb

Puedes hacer referencia el el sql
Select *
From midb.misquema.mitabla


En cuanto tengo información de Postgresql te escribo

Saludos.
Mauricio

Víctor Hugo Espínola Domínguez

unread,
Jun 12, 2015, 11:43:28 PM6/12/15
to publice...@googlegroups.com
Hola Mauricio

SCOPE_IDENTITY() devuelve NULL si no va en la misma SQLEXEC del INSERT, por tanto se debe enviar separados por ";" la sentencia INSERT ... y SELECT SCOPE_IDENTITY().

SqlExec(nHandle, "INSERT INTO tabla ....")
SqlExec(nHandle, "SELECT SCOPE_IDENTITY() AS UltId", "curUltID")
? curUltId.UltId
NULL

La solución es:
SqlExec(nHandle, "INSERT INTO tabla ....;SELECT SCOPE_IDENTITY() AS UltId", "curUltID")
o
SqlExec(nHandle, "INSERT INTO tabla ....")
SqlExec(nHandle, "SELECT @@IDENTITY AS UltId", "curUltID")
Con esta última técnica el valor devuelto será incorrecto si existe un trigger que inserte en otra tabla!

Saludos,
Víctor.
Lambaré - Paraguay.


Saludos,
Víctor.
Lambaré - Paraguay.

mpulla

unread,
Jun 13, 2015, 12:35:45 AM6/13/15
to publice...@googlegroups.com, vich...@gmail.com
Hoa Victor

Tienes razón, estoy acostumbrado a trabajar con SP y me olvide que lo mas proble mande sentencias separadas al server.

Otro modo sería

SQLEXEC(liODBCHandle, [insert into App.Tabla OUTPUT INSERTED.id Values ('PC')])

Saludos.
Mauricio

Daniel Sánchez

unread,
Jun 13, 2015, 7:04:34 PM6/13/15
to Comunidad de Visual Foxpro en Español
Si existiesen múltiples inserciones a la vez, como puedes saber que el valor del ID te corresponde a tí, o es por conexión que te retorna el valor del ID.

Saludos
--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047 RPM #948615385
Trujillo - Perú

P  Sugerimos no imprimir este e-mail a menos que sea absolutamente necesario. Protejamos el medio ambiente.

Víctor Hugo Espínola Domínguez

unread,
Jun 13, 2015, 7:52:45 PM6/13/15
to publice...@googlegroups.com
Hola Daniel

Tanto la variable @@IDENTITY como la función SCOPE_IDENTITY() devuelven el identificador generado en la conexión, pero SCOPE_IDENTITY() es más restrictiva porque devuelve el identificador generado en la transacción (ámbito), por eso se usa en los SP y si
se envía el insert desde una aplicación en el mismo comando/función se debe llamar a SCOPE_IDENTITY().
@@IDENTITY devuelve el último id generado en la conexión sin importar el ámbito, si hay un trigger que se dispara en un insert e inserta en otra tabla devuelve el id de la otra tabla.

Saludos,
Víctor.
Lambaré - Paraguay.

Daniel Sánchez

unread,
Jun 14, 2015, 2:20:51 AM6/14/15
to Comunidad de Visual Foxpro en Español
Lo que comentas esta en la ayuda, pero no me quedaba claro el tema del ámbito, pero si por ámbito se refiere al ámbito de mi conexión por mi insert realizado perfecto, sin importar que casi simultáneamente se inserten nuevos registros por otras conexiones, siempre me devolverá el ID de mi conexión.

Saludos

Víctor Hugo Espínola Domínguez

unread,
Jun 14, 2015, 11:38:52 AM6/14/15
to publice...@googlegroups.com
Hola Daniel

En términos VFP: Ámbito =  SQLEXEC(), cada llamada a SqlExec se resuelve en un ámbito, es por eso que SCOPE_IDENTITY() debe ir junto con el INSERT en la misma SQLEXEC().

Saludos,
Víctor.
Lambaré - Paraguay.

Daniel Sánchez

unread,
Jun 14, 2015, 11:30:24 PM6/14/15
to Comunidad de Visual Foxpro en Español
Víctor, lo que comentas es que debo incluir después del insert la consulta del identity????

Si uso por decir sqlexec como quedaría, ahora con un cursoradapter????

Víctor Hugo Espínola Domínguez

unread,
Jun 15, 2015, 11:58:30 AM6/15/15
to publice...@googlegroups.com
Hola Daniel

lcInsert = "Insert Into Clientes (Nombres, Apellidos) Values ('Pepa', 'Péez'); Select Scope_Identity() as UltId"
lnOK    = SqlExec(nHandle, lcInsert, "curId")
? curId.UlId

Con CA nunca lo probé, hasta ahora uso: Select @@Identity As UltID después del TableUpdate, esto es seguro si no tienes trigger disparado por el insert que haga insert en otra tabla.

Saludos,
Víctor.
Lambaré - Paraguay.


Antonio Meza

unread,
Jun 16, 2015, 12:03:13 PM6/16/15
to publice...@googlegroups.com, vich...@gmail.com
Muchas gracias, voy a agregar los datos para Sql Server y realizar pruebas para obtener el ID con los comentarios que hicieron.

Había leído que muchos recomendaban y usaban de años Postgresql en el foro y ahora nadie que usa Postgresql ha comentado nada.

saludos
Antonio Meza

Umlaut (Arg)

unread,
Dec 12, 2016, 11:57:30 AM12/12/16
to Comunidad de Visual Foxpro en Español
Estimados, en qué quedó la adaptación de FoxyDB para SQL Server ? Alguien la tiene andando para SQL Server ?

Gracias 
Reply all
Reply to author
Forward
0 new messages