Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Tipos incompatibles ??? (https://www.clubdelphi.com/foros/showthread.php?t=82997)

darkerbyte 01-05-2013 03:26:11

Tipos incompatibles ???
 
Hola colegas:

Pues ahora estoy atorado con algo bien simple pero ya no le encuentro, creo que mi cerebro está dando las últimas :confused:

Estoy utilizando un TZconnection en Delphi7/Zeos 6.6.4 Stable para conectarme a MySQL y SQlite. La situación es que tengo que implementar
un mecanismo para conectarse a cualquiera de las dos bases de datos en RunTime.

Para cambiarme de Base de Datos (de MySQL a SQlite) hago algo como esto:
Código Delphi [-]
if DM.ZCsistar.Connected then DM.ZCsistar.Disconnect;
 with DM do begin
   ZCsistar.Database:= ExtractFilePath(Application.ExeName) + '\offline.db';
   ZCsistar.Protocol:='sqlite-3';
   ZCsistar.Password:='';
   //Aqui debo cambiar el nivel de aislamiento a:
   //ZCsistar.TransactIsolationLevel := tiNone;
   ZCsistar.connect;

Ya declaré un type en mi Form con la siguiente instrucción:

Código Delphi [-]
 TZTransactIsolationLevel = (tiNone, tiReadUncommitted, tiReadCommitted,
    tiRepeatableRead, tiSerializable);

Pero el compilador me marca que los tipos no son compatibles:
Código:

[Error] Fmain.pas(7043): Incompatible types: 'ZConnection.TZTransactIsolationLevel' and 'Fmain.TZTransactIsolationLevel'
Entonces solo pude decir WTF???? :(

Ayuda please, y gracias de antemano

Casimiro Notevi 01-05-2013 04:22:46

¿Funcionan por separado?
¿Por qué no pones 2 conectores?, uno para mysql y otro para sqlite.

darkerbyte 01-05-2013 17:21:01

Dos conectores
 
Cita:

Empezado por Casimiro Notevi (Mensaje 459633)
¿Funcionan por separado?
¿Por qué no pones 2 conectores?, uno para mysql y otro para sqlite.

Gracias Casimiro por tu sugerencia.

La idea es buena y creo que si no le encuentro como cambiar el nivel de aislamiento lo haré así.

El sistema en el que estoy trabajando es para un cliente que maneja diferentes sucursales por internet y se conectan todas a un servidor en MySQL. El problema es que cuando falla el internet deja a todas las sucursales paradas. Lo que idee fue crear una copia local de la base de datos en SQLite y cuando la conexión se reestablezca con el servidor enviar toda la información en modo batch.

Entonces, ya que tenemos dos bases de datos iguales, una en MySQL y Otra en SQlite, mi idea es solo cambiar los parámetros de conexión para no afectar todo el demás código.

Al González 01-05-2013 17:40:51

Hola darkerbyte.

Cita:

Empezado por darkerbyte (Mensaje 459632)
Ya declaré un type en mi Form con la siguiente instrucción:

Código Delphi [-]
 TZTransactIsolationLevel = (tiNone, tiReadUncommitted, tiReadCommitted,
    tiRepeatableRead, tiSerializable);

Pero el compilador me marca que los tipos no son compatibles:
Código:

[Error] Fmain.pas(7043): Incompatible types: 'ZConnection.TZTransactIsolationLevel' and 'Fmain.TZTransactIsolationLevel'

Según se ve, el tipo de dato TZTransactIsolationLevel ya existe en la unidad ZConnection. No debes volver a declarar ese tipo de dato en ninguna otra unidad (Fmain), pues estarías creando otro tipo de dato de mismo nombre.

Sólo por curiosidad (y quizá la respuesta sirva a colegas que vengan después), ¿qué razonamiento te indujo a declarar el tipo de dato TZTransactIsolationLevel y sus constantes tiXXX dentro de una unidad de tu proyecto?

Saludos. :)

Casimiro Notevi 01-05-2013 18:27:06

Cita:

Empezado por darkerbyte (Mensaje 459654)
Entonces, ya que tenemos dos bases de datos iguales, una en MySQL y Otra en SQlite, mi idea es solo cambiar los parámetros de conexión para no afectar todo el demás código.

También podías haber creado la local en mysql y te ahorra de tener 2 distintas.
Aunque haz caso a Al, él sabe más que yo de estas cosas.

darkerbyte 02-05-2013 00:49:03

Tipos diferentes
 
Hola Al.

El porqué necesito cambiar el nivel de aislamiento de la conexión en Zeos es porque cuando ejecutas un script no lo procesa. No se si se deba a un error de las librerías de Zeos, pero si mandas una transacción en MySQL usando Zeos/ZQLprocessor funciona bien con:

Código:

TZTransactionIsolationLevel:= ReadUncomited;
Pero para que funcione en SQLite es necesario
Código:

TZTransatcionIsolationLevel:= tiNone;
Lo pongo por si alguien esta sufriendo con las transacciones en SQLite.

Bueno contestando tu pregunta, cuando intenté hacer esto:
Código:

ZConection.TransactionIsolationLevel := tiNone;
El compilador me manda:
Código:

Undeclared identifier: tiNone
Lo primero que intenté fue poner la unit "Zconection.pas" en el uses del Form, pero no funcionó.
Así que intenté declarar el tipo de datos para poder asignarlo y tampoco.
Y ahí me atoré y ya no supe como hacerle :p

Gracias a todos por sus valiosas respuestas :D

darkerbyte 02-05-2013 01:26:47

La desesperación....
 
Pues necesito avanzar con el proyecto y me ganó la desesperación...
Me metí a código del componente Zconnection y declaré estos métodos públicos:
Código Delphi [-]
procedure TZConnection.setTILnone;
begin
 SetTransactIsolationLevel(tiNone);
end;

procedure TZConnection.setTILread;
begin
  SetTransactIsolationLevel(tiReadUncommitted);
end;

Y ya esta funcionando, ahora si, mando un script en un ZSQLproccessor y me guarda los datos en la BD.
Aunque no me siento muy seguro de la solución. Creo que no es lo mas apropiado, pero esta funcionando :p

Pero necesito aprender, porque no me funcionó como le intenté antes :confused:

Al González 02-05-2013 04:45:40

Cita:

Empezado por darkerbyte (Mensaje 459680)
Pero necesito aprender, porque no me funcionó como le intenté antes :confused:

¿Habras querido decir lo siguiente?
Cita:

Empezado por darkerbyte (Mensaje 459680)
Pero necesito aprender por qué no me funcionó como le intenté antes :confused:

¿Dices que no funcionó poner la unidad en el Uses? ¿Cómo la pusiste? ¿Qué error exacto te aparece al compilar?

Saludos desde Impunilandia.

darkerbyte 03-05-2013 07:26:07

Exactamente el mismo error
 
Hola Al.

Estuve rastreando el código de Zeos y Zconnection.pas usa el type TZTransactionIsolationLevel de otra unidad (que no recuerdo bien el nombre pero es algo así como ZAbstract...pas). Creo entonces que por eso aún cuando importé la unidad Zconnection.pas no me funcionó. Bueno esta es la teoria, necesito hacer una prueba importando el otro archivo. Pero al parecer este era el truco

Ah, No sabía que si tu declaras un type en dos unidades diferentes, aunque se llamen iguales para Delphi son diferentes :eek:

Gracias Al, eres muy amable. ^\||/

Por cierto estuve revisando tu blog. Vi que mencionas sobre una libreria para Delphi que te permite generar CDFI con Facturaxion, te podría
solicitar un poco mas de información por inbox?


La franja horaria es GMT +2. Ahora son las 06:09:08.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi