Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Temas relacionados > Redes
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-03-2021
GINMARMENOR GINMARMENOR is offline
Miembro
 
Registrado: feb 2016
Posts: 58
Poder: 9
GINMARMENOR Va por buen camino
Modificar registros en red

Hola,

Tengo un programa hecho con Delphi 2.010 y uso Firebird 2,5, la base de datos está en un servidor de un ordenador A compartido donde puedo acceder desde otros ordenadores sin problemas, pudiendo ver todos los listados y añadir registros o modificarlos en red desde cualquier otro ordenador.

El problema es que todo esto lo puedo hacer bien, pero cuando estoy yo sólo modificando los registros, pero cuando otro ordenador se conecta a ese programa en red, puede ver cualquier listados conjuntamente pero a la hora de insertar registros se queda bloqueado pensando dando error, aunque los otros ordenadores no estén modificando la misma tabla.

También ocurre cuando el mismo ordenador abre dos veces el programa, se queda como pensando sin poder avanzar.

No sé qué debo de hacer para poder para poder trabajar en red, modificando registros en red sin que se bloquee si necesita alguna configuración interna.

Gracias.
Responder Con Cita
  #2  
Antiguo 24-03-2021
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Falta TODA la información para poder ayudarte.
Ni siquiera has dicho el error, simplemente has dicho que "se queda bloqueado dando error"

¿Es un programa en un ordenador al que se conectan los demás o es un programa en cada ordenador que conecta a un servidor firebird?
¿Qué parámetros usas en el componente de base de datos y en el de transacción? Creo que ni has dicho los componentes que usas.
En fin, replanteate la pregunta mejor para que podamos ayudar.
Saludos.
Responder Con Cita
  #3  
Antiguo 25-03-2021
identsoft identsoft is offline
Miembro
 
Registrado: abr 2006
Posts: 282
Poder: 18
identsoft Va por buen camino
Yo tengo el mismo problema: dos equipos(PC1 y PC2) conectados en red local. Cada equipo tiene instalado el mismo programa que atacan a la base de datos Firebird 2.5 que está en el equipo pc1. Pc2 tiene firebird cliente. el puerto 3050 está abierto, Firewall está inactivo(de momento)...
El programa está desarrollado en delphi xe7.
Si estoy introduciendo datos en un equipo(pc1) al introducir datos en el otro(pc2) se queda pensando .. y cuando cierro el programa en el primero (pc1) sale un error en el segundo: "deadlock update conflicts with concurrent update....."
He seguido por debug donde da el error y me da en
Código Delphi [-]
        ZI := TSQLQuery.Create(ZC);
        ZI.SQLConnection := frmMain.SQLConnection1;
        ZI.SQL.Text := '';
        ZI.SQL.Text := ' update contador set NUM_EXPE = ' + IntToStr(result) +
                       ' where EMPRESA = ' + emp + ' and ACTIVIDAD = ' + act +
                       ' and EJERCICIO = ' + eje;
        ZI.ExecSQL();
        ZI.close;
Previamente no hay ningún update de ninguna tabla porque es lo primero que hace el programa después de login.
Que estoy haciendo mal?
Gracias
Responder Con Cita
  #4  
Antiguo 25-03-2021
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Lee mi contestación anterior.
Haz una búsqueda por "deadlock" en los foros, llegarás a hilos como este, por ejemplo.

Última edición por Casimiro Notevi fecha: 25-03-2021 a las 11:35:19.
Responder Con Cita
  #5  
Antiguo 25-03-2021
identsoft identsoft is offline
Miembro
 
Registrado: abr 2006
Posts: 282
Poder: 18
identsoft Va por buen camino
A ver Casimiro , un poco de paciencia con los novatos, jejeje...
Creo que he contestado a casi todas las preguntas que haces:

1.-Ni siquiera has dicho el error, simplemente has dicho que "se queda bloqueado dando error"
R.- "deadlock update conflicts with concurrent update....."

2.-¿Es un programa en un ordenador al que se conectan los demás o es un programa en cada ordenador que conecta a un servidor firebird?
R.-Cada equipo tiene instalado el mismo programa que atacan a la base de datos Firebird 2.5 que está en el equipo pc1
3.- ¿Qué parámetros usas en el componente de base de datos y en el de transacción? Creo que ni has dicho los componentes que usas?
R.- Es cierto, esta no la había contestado. Uso componentes dbexpress. No uso transacciones (al menos donde da el error).
los parámetros de conexión :
DriverName=FIREBIRDCONNECTION
getDriverFunc=getDriverFirebird
Database=C:\baseDatos\datos\GESTORIA.FDB
RoleName=RoleName
User_Name=sysdba
Password=masterkey
sqldialect=3
LocaleCode=0000
Blobsize=-1
CommitRetain=False
waitonlocks=True
isolationlevel=ReadCommitted
trim char=False
HostName=localhost

Estos son los parámetros en el equipo PC1 que hace de servidor. En el otro se cambia el Hostname.
El programa se queda pensando al hacer ZI.EXECSQL

No se que más datos poner, si necesitas algo más, por favor, pídemelo.
Y sobretodo GRACIAS por tu tiempo.
Responder Con Cita
  #6  
Antiguo 25-03-2021
identsoft identsoft is offline
Miembro
 
Registrado: abr 2006
Posts: 282
Poder: 18
identsoft Va por buen camino
Creo que se ha solucionado.
He metido el update dentro de una transacción y de momento parece que funciona.
Seguiré probando.
Gracias Casimiro.
Responder Con Cita
  #7  
Antiguo 25-03-2021
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
¿Usas algún bloque TRY...EXCEPT o TRY...FINALLY? Lo digo porque es posible que salte alguna excepción que, al no ser tratada adecuadamente, deje la conexión "colgada" (por ejemplo, porque no se cierra la conexión). De hecho, al usar transacciones estás creando una especie de "burbuja de seguridad" que hace que, si hay un error, no se ejecute el programa SQL y por eso te deja de dar error ahora. El problema es que, si cuando hay error no se cierra correctamente la transacción (no se hace roll-back) esa transacción se quede ahí hasta que se cierra el programa, con los problemas que puedan derivarse de ello (en el mejor de los casos, desperdicio de memoria).

Por supuesto, hay que usar transacciones siempre que se hace un programa que posibilite a varios usuarios acceder a una misma base de datos.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #8  
Antiguo 25-03-2021
identsoft identsoft is offline
Miembro
 
Registrado: abr 2006
Posts: 282
Poder: 18
identsoft Va por buen camino
Si, ya lo he metido dentro de un bloque try except.
Y a partir de ese momento ha empezado a funcionar bien.
Lo curioso es que el Update se quedaba colgado (sin dar ningún tipo de error en el ordenador donde se estaba ejecutando) y eso impedia el acceso de otros ordenadores y en estos sí que terminaba por salir un error deadlok.

Gracias Nuño
Responder Con Cita
  #9  
Antiguo 30-05-2021
GINMARMENOR GINMARMENOR is offline
Miembro
 
Registrado: feb 2016
Posts: 58
Poder: 9
GINMARMENOR Va por buen camino
perdonar he estado un tiempo fuera, dentro del try...except que excepción tendría que poner.

Gracias.
Responder Con Cita
  #10  
Antiguo 31-05-2021
identsoft identsoft is offline
Miembro
 
Registrado: abr 2006
Posts: 282
Poder: 18
identsoft Va por buen camino
Eso depende de lo que tenga que hacer el bloque try except, desde un simple mensaje genérico y cancelación del proceso hasta detectar el tipo de mensaje y hacer 'cosas' en función del mensaje, etc...
Responder Con Cita
  #11  
Antiguo 31-05-2021
GINMARMENOR GINMARMENOR is offline
Miembro
 
Registrado: feb 2016
Posts: 58
Poder: 9
GINMARMENOR Va por buen camino
Mi problema básicamente es aparentemente sencillo, y es que el ordenador se queda pensando indefinidamente sin dar ningún tipo de error, se queda como bloqueado aparece el icono del tiempo en medio la pantalla como si estuviera haciendo algo pero ahí se queda indefinidamente sin dar error de ningún tipo de error y pensando.

Mi arquitectura de la base de datos es sencilla, tengo una base de datos creada en IbExpert con Firebird 2,5 la cual se puede llamar Bdatos1, con 20 campos.

En mi programa que llamo Aplicacion1, en un Formulario conecto mediante un TIBDabase, junto con el TIBTrasaccion ambos los asocio con DefaultDadabase y DefaultTranssacción.

A su vez conecto las distintas tablas del TibDatabase y todo es perfecto, trabajo en el PC1 sin problemas.

Ahora en el PC2, copio el programa que he hecho "Aplicacion1', y conecto mediante la base de datos mediante un Archivo.INI la ruta donde está la Base de Datos 'Bdatos1', y se conecta perfectamente, puedo ver cualquier registro, imprimir cualquier listado, sin ningún problema, eso tanto en el PC1 como en el PC2, podemos ver cualquier listado yo tengo Rave Reports, o cualquier consulta.

El problema viene, cuando tanto en el PC1, como en el PC2, después de hacer cualquier consulta, intentamos modificar o insertar cualquier registro en esa Base de Datos que está compartida en ese momento, entonces cuando pulso el botón de Grabar, tanto sea en el PC1 como en el PC2, se pone el icono del tiempo tanto vueltas y vueltas indefinidamente sin poder continuar, teniendo que salir del programa y volver hacer la operación.

Por lo que he podido leer es un problema en el TIbTransacción que hay que poner una excepción para evitarlo por eso esa era mi pregunta o ver dónde podría encontrar una explicación.

Me haríais un mundo, gracias.
Responder Con Cita
  #12  
Antiguo 31-05-2021
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Qué propiedades has puesto en el componente IBTransaction?
¿Qué quieres decir con que la BD está compartida?
Responder Con Cita
  #13  
Antiguo 31-05-2021
identsoft identsoft is offline
Miembro
 
Registrado: abr 2006
Posts: 282
Poder: 18
identsoft Va por buen camino
Como dice Nuño Martinez anteriormente, pon los insert y los update dentro de transacciones y dentro de un bloque TRY EXCEPT, TRY FINALLY y te evitarás muchos problemas.
Lo que sí hay que hacer dentro del bloque EXCEPT es cerrar la transacción (ROLLBACK)
Responder Con Cita
  #14  
Antiguo 02-06-2021
GINMARMENOR GINMARMENOR is offline
Miembro
 
Registrado: feb 2016
Posts: 58
Poder: 9
GINMARMENOR Va por buen camino
Casimiro, la Transacción está con las propiedades por defecto, no se ha cambiado ninguna propiedad.

la Base de Datos compartida, es simplemente que está en el PC1, y accedo a ella desde el PC2, mediante la red
Código Delphi [-]
                [BD]
                PATH:"192.xxx.x.xxx:C:\Aplicacion1\BaseDatos01\"

Con esto accedo a la base datos, inserto y modifico, desde el PC2, pero cuando abro la aplicación en el PC1 también y están los dos PC con la misma aplicación , ya el PC2 se queda eternamente pensando sin dar ningún error, se queda bloqueado cuando intento modificar o insertar un registro, pero no cuando quiero leer, hacer un listado en ese caso funciona bien aun estando los dos PC con la misma aplicación abierta, la lectura se hace bien pero no el insertar o modificar.
Responder Con Cita
  #15  
Antiguo 03-06-2021
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pon estos parámetros al componente Transaction que uses:
Código:
write
nowait
rec_version
read_commited
Responder Con Cita
  #16  
Antiguo 17-07-2021
GINMARMENOR GINMARMENOR is offline
Miembro
 
Registrado: feb 2016
Posts: 58
Poder: 9
GINMARMENOR Va por buen camino
Código Delphi [-]
write
nowait
rec_version
read_commited

Hola de nuevo, he puesto en la propiedd Params del IbTranssation estas líneas. pero me el siguiente error:

Código Delphi [-]
         TPB constant 0 is unknowm

Por otro lado veo que otra solucion es usar un Try ... Except, Try ... Finally, pero no tengo idea de como usarlo y donde ponerlo si en un evento de IbTranssation, u otro lugar, si pudierais decirmo donde encontrar un ejemplo o poner un ejemplo ya que esto debe ser algo genérico valido para todos.

Yo para recordarlo uso Delphi 2.010 y Firebird 2,5, creo la IbDatabase y IbTransattion de las cuales todos los parámetros configurados son los que vienen por defecto, hasta base de datos las asocio a 15 o 20 tablas, las cuales no las uso ni las abro a la vez lógicamente si no según necesite, y en las cuales inserto, modifico y borro registros sin problemas todo perfecto, el problema viene en dos casos:

uno: cuando por error abro la misma aplicación dos veces en el mismo pc, entonces se bloquea quedándose pensando hasta que lo cierro mediante boton de derecho del ratón en la parte de abajo de la pantalla, le pincho en cerrar aplicación esto lo hace windows, ya que yo en la "X" del formulario no me deja.

Dos: cuando yo estoy trabajando en el Pc1 en la Base de Datos 1, y se conecta desde Pc2 en la misma Base de Datos 1, ocurre lo mismo, puedo consultar listados en el Rave Reports que uso bien, pero en el momento que uno de los dos Pc's intenta grabar algo se bloquea y ocurre lo mismo que en el paso uno.


Sólo es ese problema, el que se bloquee cuando dos ordenadores acceden a la mismo base de datos, por lo que debe ser ser algo genérico, común a todos, no de que haya programado algo mal, pero no consigo dar con la tecla, si me podéis ayudar, gracias.
Responder Con Cita
  #17  
Antiguo 17-07-2021
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
La verdad es que no se entiende nada de lo que comentas
No está claro lo que estás haciendo, ni cómo lo estás haciendo, ni qué código estás usado, ni cómo lo estás usando... es casi imposible poder ayudarte así.
Trata de crear un proyecto de ejemplo, lo más simple que puedas, y a partir de ahí ir avanzando a cada paso.
O si el proyecto que tienes no es muy grande, trata de subirlo para que le podamos echar un vistazo.
Responder Con Cita
  #18  
Antiguo 17-07-2021
GINMARMENOR GINMARMENOR is offline
Miembro
 
Registrado: feb 2016
Posts: 58
Poder: 9
GINMARMENOR Va por buen camino
Casimiro, si es que no hay ningún código, tengo Delphi 2.010 y Firebird 2.5

tengo en un Formulario la base de Datos IBDatabase1 y un IBTransaction1:

IbDatabase1: propiedad DefaultTransaction: IBTransaction1

IbTransaction1: Propiedad DefaultDababase: IBDatabase1

Pongo las propiedades de ambos en Connected en True y todo perfecto.

luego asocio las distintas IbTablas a la IbDatabase1 y todos los DataSources a su IbTable correspondiente, pongo los Actives en True y todo se conecta bien.

Copio el programa en PC1 y trabajo con el programa perfectamente, cuando grabo los distintos registros mediante:

Código Delphi [-]

            IbTabla1.post

Todo funciona perfectamente

Copio el programa en el PC2 y asocio la base de datos del servidor que está en el PC1 de la siguiente manera, mediante un archivo .INI.

Código Delphi [-]

                [BD]
                PATH:"192.xxx.x.xxx:C:\Aplicacion1\BaseDatos01\"

Ahora bien a partir de ahora se dan dos supuestos.

1) El Programa NO lo tengo abierto en el PC1 y trabajo en el PC2 en red, entonces trabajo perfectamente en red, grabo los registros mediante IbTabla1.post, y todo bien.

2) El Programa lo tengo abierto en el PC1 en ese momento e intento desde el PC2 grabar algún registro en red mediante IbTabla1.post, se me queda bloqueado indefinidamente, tengo que cerrar el programa en el PC2 como pueda o bien apagar el ordenador, esto ocurre igual si trabajo en el PC1 y tengo abierta la base de datos en el PC2.

Ésto es el problema que tengo al trabajar en red, que cuando la base de datos está abierta en los DOS PC a la vez, no puedo grabar nada por que se bloquea básicamente, aunque no esté en el mismo registro de la misma Tabla.

No sé si necesitas algún dato más Casimiro, y gracias por el tiempo
Responder Con Cita
  #19  
Antiguo 17-07-2021
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Bien, empecemos por el principio
Lo primero de todo, desconecta la BD en modo diseño cuando vas a compilar. No debes dejar conectada/activa la BD cuando compilas para crear el ejecutable.

Debes conectar a la BD en tiempo de ejecución, por ejemplo como has indicado, al abrir el programa éste lee la ruta a la BD en un .ini y entonces es cuando debes conectarla.
Eso es lo primero.

Cámbialo y ya seguimos con el resto.
Responder Con Cita
  #20  
Antiguo 18-07-2021
GINMARMENOR GINMARMENOR is offline
Miembro
 
Registrado: feb 2016
Posts: 58
Poder: 9
GINMARMENOR Va por buen camino
Pues cambiado está tengo las dos bases de datos IbDatabase1 y IbDatabase2 (que es la que aglutina a todas las tablas Maestros) desconectadas y las abro cuando ejecuto la aplicación.

Con IbDatabase1 tengo unas 20 tablas conectadas que voy usando según necesidades y con IbDatabase2 tengo unas 20 conectadas a su vez.

He intentado hacer hacer unas pruebas, pero no quiero adelantarme.

Seguimos hablando.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Firebird remoto - Modificar registros Gregorio Cíber Conexión con bases de datos 8 23-03-2021 23:32:04
modificar variios registros con dataset pmtzg Conexión con bases de datos 7 11-02-2012 13:05:02
Modificar registros desde DBgrid quakerman Conexión con bases de datos 7 09-11-2011 04:40:03
modificar registros yossi SQL 6 11-06-2010 04:43:58
modificar registros query Buelos Firebird e Interbase 8 02-03-2008 01:52:00


La franja horaria es GMT +2. Ahora son las 17:27:56.


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