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 02-02-2006
adelaida adelaida is offline
Registrado
 
Registrado: oct 2005
Posts: 5
Poder: 0
adelaida Va por buen camino
Error con Key violation

Hola Buenas noches.

Tengo el siguiente error que se genera al mostrar en un DBGrid la consulta formada por 2 tablas.

En la Tabla pacientes tengo como llave primaria el campo id_paciente y en la tabla sesiones tengo como llave foranea id_paciente.

Este es mi codigo:

SQLDataSet1.CommandText := 'SELECT a.nombre, a.apellidop, b.* FROM
pacientes a, sesiones b WHERE a.id_paciente=b.id_paciente and
a.nombre=:nombre';
SQLDataSet1.Params[0].AsString := tnombre.Text;
SQLDataSet1.Open;
DBgrid1.DataSource.DataSet.Refresh;
SQLDataSet1.Close;


Estoy pasando como parametro con tnombre.tex el nombre del paciente que quiero consultar, cuando yo consulto un paciente que tiene una sola sesion todo funcina muy bien, pero si tengo dos sesiones con un mismo paciente es decir la tabla sesiones contiene lo siguiente:

id_sesion id_paciente fecha
1 1 27/01/2006
2 2 28/01/2006

Automaticamente al hacer DBgrid1.DataSource.DataSet.Refresh;
me marca el error key violation, y necesito esa linea de codigo, por que si no no veo nada en el DBGrid1.

Alguna idea, siento que el problema esta con el Refresh.....?

De antemano muchas gracias por su atención.
Responder Con Cita
  #2  
Antiguo 02-02-2006
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Lo que no veo claro, es por qué haces un refresco de una consulta que acaba de abrirse?

Yo simplemente quitaría esa línea, además como consulta que es, supongo que quedará estática durante todo su tiempo de vida.

Un Saludo
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 02-02-2006
Scooter Scooter is offline
Registrado
 
Registrado: mar 2005
Posts: 2
Poder: 0
Scooter Va por buen camino
Deberías eliminar las 2 últimas líneas:

- La primera de ellas no produce ningún resultado siempre que lo que refrescas sea el mismo SQLDataSet1. En realidad no entiendo por qué siempre lo usas directamente y en esa línea lo llamas a través del Grid y del DataSource. Asegurate de que el grid está realmente conectado a un DataSource que apunte a SQLDataSet1.

- En el caso de la segunda, si cierro el dataset pierdo el cursor y el grid no mostrará nada.

Y por último, asegurate de que tu grid sea de solo lectura para evitar que involutariamente se produzca una inserción que te produzca el Key Violation y de no haber asociado en ningún evento de estos componentes algo que provoque la inserción (usa un punto de ruptura y trazalo con F7)


Salu2.
Scooter

SQLDataSet1.CommandText := 'SELECT a.nombre, a.apellidop, b.* FROM
pacientes a, sesiones b WHERE a.id_paciente=b.id_paciente and
a.nombre=:nombre';
SQLDataSet1.Params[0].AsString := tnombre.Text;
SQLDataSet1.Open;
DBgrid1.DataSource.DataSet.Refresh;
SQLDataSet1.Close;

Responder Con Cita
  #4  
Antiguo 02-02-2006
adelaida adelaida is offline
Registrado
 
Registrado: oct 2005
Posts: 5
Poder: 0
adelaida Va por buen camino
Gracias por sus comentarios

De antemano muchas gracias......

Pues bien, estoy usando la linea DBgrid1.DataSource.DataSet.Refresh; para poder ver algo en el bdgrid, ya que si no la coloco no aparece nada, ya he leido a cerca de esto y simplemente con hacer el SQLDataSet1.Open y SQLDataSet1.Close se deberia de ver la información, pero no es asi.


Ahora mis componentes estan bien conectados los tengo de la siguiente manera: SQLConnection ---> SQLDataSet ---> DataSetProvider ---> ClientDataSet ------> DataSource.


A fin de cuentas solo es una consulta, no estoy modificando ni editando, ya corri mi programa con F7 y la linea que causa conflictos o más bien donde marca el error del Key violation es en: DBgrid1.DataSource.DataSet.Refresh.


Gracias por sus comentarios. Si tuvieran alguna otra observación, se los agradeceria
Responder Con Cita
  #5  
Antiguo 20-02-2007
dieleo dieleo is offline
Miembro
 
Registrado: ago 2006
Posts: 18
Poder: 0
dieleo Va por buen camino
Hola a todos.

A mi me pasa algo parecido, con algunos ClientDataSet pero al realizar un locate.
Al realizar un Locate sobre un ClientDataSet, esporadicamente da Key Violation, me esta volviendo medio loco esto. Si alguien tiene alguna idea, lo agraderia.

Saludo a todos.
Responder Con Cita
  #6  
Antiguo 20-02-2007
waly2k1 waly2k1 is offline
Miembro
 
Registrado: dic 2006
Ubicación: El país de las maravillas(Argentina)
Posts: 251
Poder: 18
waly2k1 Va por buen camino
Error Locate ???

No es el Locate la causa de tu error, sino las asociaciones que tengas entre tablas y al no estar bien algo es como que a un campo clave intenta asignarle el valor de otro registro al moverse de registro, entonces salta el error. Fijate combos y otros objetos sobre todo la propiedad Datafield y Datasource.

Seguilo un poco al código y verás que es algo tan sencillo y no te compliques buscando la 5ta. pata del gato

Saludos
Responder Con Cita
  #7  
Antiguo 21-02-2007
dieleo dieleo is offline
Miembro
 
Registrado: ago 2006
Posts: 18
Poder: 0
dieleo Va por buen camino
Gracias, voy a intentarlo.

Saludos.
Responder Con Cita
  #8  
Antiguo 21-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
adelaida, ¿a qué te refieres con que no ves nada en el grid? ¿Tienes definidas las columnas del Grid en tiempo de diseño o no?.

Si no las tienes, porque el sql cambia frecuentemente, usa dbgrid1.columns.RebuildColumns.

Si el nombre no lo escribes exactamente como está en la base de datos, tampoco ofrecerá los resultados deseados, deberías usar "Where nombre like '*pepe*' (creo recordar que en ADO el asterisco es el comodin si no, prueba con '%pepe%')
Código Delphi [-]
SQLDataSet1.CommandText := 'SELECT a.nombre, a.apellidop, b.* FROM
pacientes a, sesiones b WHERE a.id_paciente=b.id_paciente and
a.nombre like :nombre';
SQLDataSet1.Params[0].AsString := '*'+ tnombre.Text+ '*';

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #9  
Antiguo 21-02-2007
dieleo dieleo is offline
Miembro
 
Registrado: ago 2006
Posts: 18
Poder: 0
dieleo Va por buen camino
Hola a todos.

Pude descubrir en mi caso porque daba Key Violation al realizar un Locate o Filtrar la tabla, en el componente ClientDataSet puse la propiedad PacketRecords = -1,

Si quiero traer por cantidad de registros ,trabajo de otra manera, el error lo daba en el procedimiento CheckBrowseMode del ClientDataSet, dentro del componente. La verdad no se si es un bug o funciona asi, no lo investigue mucho mas.

Si eso te puede ayudar en algo, bueno suerte.

Saludos a todos.
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 corregir un error de access violation en delphi... uper Firebird e Interbase 9 03-12-2005 21:10:05
Key Violation en tabla sin claves primarias mak8888 Tablas planas 6 27-02-2005 11:48:12
Eaccess Violation en Preview de Quickreport. Entorno xp luismi Impresión 1 21-10-2004 13:43:33
Acces Violation eduarcol Impresión 10 23-01-2004 19:03:18
Exception class EAccess violation... Giniromero Conexión con bases de datos 1 13-06-2003 12:47:38


La franja horaria es GMT +2. Ahora son las 08:43:33.


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