Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-06-2008
hibero hibero is offline
Miembro
 
Registrado: nov 2003
Posts: 104
Poder: 21
hibero Va por buen camino
FB+IBX+IBTransaction+ClientDataSet

Utilizo IBX+ClientDataSet para acceder a FB 2 .

Utilizo un componente IBDataBase un componente IBTransaction
y el esquema de conexion de a cada Tabla viene siendo el que sigue

IBQuery<---DataSetProvider<---ClientDataSet<---DataSource<---DBGrid

si hago un cambio en el DBGrid se dispara el evento AfterPost, AfterDelete en el cual hago un

ClienteDataSet.ApplyUpdates(-1);

Todo funciona perfecto. El problema es si abro el programa en otro ordenador accediendo de forma concurrente sobre la misma tabla y base de datos. El segundo Ordenador no se entera de los cambios que ha hecho el primero a no ser que haga un commit. Es decir

Si A los eventos AfterPost y afterDelete les pongo el codigo

ClientDataSet.ApplyUpdates(-1);
if IBQuery.Transaction.InTransaction then IBQuery.Transaction.commit;

Es esto normal. O estoy haciendo algo mal
Responder Con Cita
  #2  
Antiguo 17-06-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola!

Un compañero acaba de tener una duda similar. Creo que si echas un vistazo a lo que comento en este hilo se despejarán algunas de tus dudas:

http://www.clubdelphi.com/foros/showthread.php?t=57459

También considera que la naturaleza de una transacción es precisamente "aislar" un grupo de operaciones de tal manera que sólo la aplicación que las ha ejecutado puede verlas hasta que ésta las da por confirmadas. La transacción asegura que se realicen todas las operaciones sin problema alguno o bien que no se confirme ninguna de ellas, pero que no quede en la base de datos la información "a medias".

La anterior es una de las varias razones por las cuales la gente prefiere el uso de bases de datos cliente-servidor en lugar de las antiguas y frágiles bases de datos de escritorio (Access, Paradox, dBase, Fox, etc.).

Cabe mencionar que la transacción se inicia con cierto "nivel de aislamiento", y dependiendo de este nivel es que una conexión podrá ver o no los cambios aún no cometidos (confirmados) por otra conexión.

Tradicionalmente se emplea el nivel de aislamiento "Read Committed", el cual no permite consultar información que todavía no haya sido cometida por otras transacciones.

Espero haber ayudado a orientarte. No dejes de retroalimentar el hilo con tus inquietudes al respecto.

Un abrazo.

Al González.
Responder Con Cita
  #3  
Antiguo 17-06-2008
hibero hibero is offline
Miembro
 
Registrado: nov 2003
Posts: 104
Poder: 21
hibero Va por buen camino
he mirado en el hilo que me comentas, ya lo habia estado leyendo, pero al tratarse de distintos componentes (creo en ese hilo se utiliza FIB) decidí abrir este segundo hilo.
En mi caso símplemente es que tenia entendido que el DataSetProvider se encargada de iniciar (startTransaction) y finalizar (Commit o rollback) las transacciones.
Responder Con Cita
  #4  
Antiguo 17-06-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por hibero Ver Mensaje
...tenia entendido que el DataSetProvider se encargada de iniciar (startTransaction) y finalizar (Commit o rollback) las transacciones.
Doy la misma respuesta.
http://www.clubdelphi.com/foros/show...48&postcount=6
Responder Con Cita
  #5  
Antiguo 18-06-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 22
Rockin Va por buen camino
Tengo el mismo problema como indica AI Gonzalez, he hehcho de todo pero nada. Si alguien encuentra la solución que la postee.

Gracias y saludos.
Responder Con Cita
  #6  
Antiguo 18-06-2008
hibero hibero is offline
Miembro
 
Registrado: nov 2003
Posts: 104
Poder: 21
hibero Va por buen camino
el caso es que tengo un tibtransaction y un tibdatabase desde que conecto a la base de datos (tibdatabase.open) si el componente tibtransaction inicia una transaccion (Por lo tanto me veo obligado a realizar un commit tras realizar un applyupdates en el client dataset).
en vista de esto he asociado un componente transaccion para el componente ibquery es decir (diferente del que tiene asociado el componente tibdatabase)
TIbtransaction<--TIBQuery<--TDataSetProvider<--TClientDataSet<--TDataSource<---TDBGrid

En este caso si yo no hago en mi codigo un tibtransaction.Starttransaction no se debería haber iniciado una transacción y entiendo que el TDataSetprovider deberia manejar las transacciones por mi. Pero sigo teniendo el mismo problema (Problema que en realidad se soluciona si siempre que hago un applyupodate a continuacion hago una commit de la transaccion asociada)
Responder Con Cita
  #7  
Antiguo 18-06-2008
hibero hibero is offline
Miembro
 
Registrado: nov 2003
Posts: 104
Poder: 21
hibero Va por buen camino
Lo he solucionado haciendo un commit tras cada Applyupdates pero no se si es lo correcto, el caso es que funciona
Responder Con Cita
  #8  
Antiguo 18-06-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 22
Rockin Va por buen camino
¿Donde haces el commit en el Servidor de Capa Intermedia o en la Aplicación Cliente?

saludos.
Responder Con Cita
  #9  
Antiguo 18-06-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 22
Rockin Va por buen camino
Ya he conseguido realizar los cambios en la BD pero solo se realizan cuando cierro la Aplicacion. ¿Que tengo que hacer para se realicen en el momento?
Responder Con Cita
  #10  
Antiguo 18-06-2008
hibero hibero is offline
Miembro
 
Registrado: nov 2003
Posts: 104
Poder: 21
hibero Va por buen camino
Rockin en vez de cerrar haz un commit y seguramente se te grabaran los datos (po al menos eso es lo que me pasa a mi).
En mi caso estoy haciendo pruebas asi que tengo todo en un modulo de datos. Pero supongo que lo haras donde tengas el componente transaccion o no
Responder Con Cita
  #11  
Antiguo 19-06-2008
Avatar de Cañones
Cañones Cañones is offline
Miembro
 
Registrado: ene 2007
Ubicación: La Paz Entre Ríos
Posts: 354
Poder: 18
Cañones Va por buen camino
Hola a todos.
Para este tema Yo deje un ejemplo de como lo solucione.
http://www.clubdelphi.com/foros/show...5&goto=newpost

No se si es lo mejor, pero me funciona.

Saludos. Espero que sirva de algo.
Responder Con Cita
  #12  
Antiguo 19-06-2008
Gabriel Gabriel is offline
Miembro
 
Registrado: may 2003
Ubicación: PalauTordera
Posts: 115
Poder: 22
Gabriel Va por buen camino
con DBX

Siempre me a ido perfecto, desde la versión 1 de Firebird hasta la 2.1 que utilizo ahora
al Aceptar y hacer el Post i el Apply, cualquier cliente ya ve los datos gravados, en el acto.


SQLQuery - DatasetProvider - ClientDataset

try
ClientDataSet1.Post;
ClientDataSet1.ApplyUpdates(0);
except
ClientDataSet1.Cancel;
ClientDataSet1.CancelUpdates;
end;

en el TSQLConnection (solo uno por aplicación)

procedure TFModuloIni.SQLConnection1BeforeConnect(Sender: TObject);
begin
SQLConnection1.ConnectionName := 'MiConexion';
SQLConnection1.DriverName :='Interbase';
SQLConnection1.Params.Values['BlobSize'] := '-1';
SQLConnection1.Params.Values['CommitRetain'] := 'False';
SQLConnection1.Params.Values['Database'] := Utilidades.DataBaseUtil;
SQLConnection1.Params.Values['ErrorResourceFile'] := '';
SQLConnection1.Params.Values['LocaleCode'] := '0000';
SQLConnection1.Params.Values['Password'] := 'masterkey';
SQLConnection1.Params.Values['RoleName'] := 'RoleName';
SQLConnection1.Params.Values['ServerCharSet'] := '';
SQLConnection1.Params.Values['SQLDialect'] := '1';
SQLConnection1.Params.Values['Interbase TransIsolation'] := 'ReadCommited';
SQLConnection1.Params.Values['User_Name'] := 'sysdba';
SQLConnection1.Params.Values['WaitOnLocks'] := 'True';
end;


Salut
__________________
Gabriel
Responder Con Cita
  #13  
Antiguo 19-06-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por Rockin Ver Mensaje
Tengo el mismo problema como indica AI Gonzalez...
¿Y ese quién es?
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como manejo el ibstoredproc, el ibtransaction y el clientedataset ingabraham Varios 5 16-02-2008 01:20:47
IBTransaction edy_aca Conexión con bases de datos 0 14-03-2005 18:33:38
DE BD SQL a CLIENTDATASET ada MySQL 0 05-10-2004 12:18:41
Rendimiento e IBTransaction brandolin Firebird e Interbase 1 01-06-2004 21:33:06
Consultas IBDatabase - IBTransaction PALANCA Firebird e Interbase 3 29-07-2003 15:31:44


La franja horaria es GMT +2. Ahora son las 23:39:32.


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