Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-02-2005
mak8888 mak8888 is offline
Miembro
 
Registrado: sep 2003
Posts: 40
Poder: 0
mak8888 Va por buen camino
Key Violation en tabla sin claves primarias

Os explico. Llevo bastante tiempo utilizando una base de datos. Es muy simple. Tiene una campo Code de Tipo Autoincremental y Key *. El resto de campos son normales (strings) de distinto tamaño. No tienen enlaces con ninguna otra tabla, ni en la tabla hay declarada clave primaria alguna. Es decir, es una tabla de lo más simple.
Desde hace un par de días vengo teniendo errores que no consigo explicar. Al hacer un insert meto relleno todos los datos tal y como siempre venía haciendo (no he modificado el código), pero ahora en el table.post da "Key Violation".
Ya no sé que probar. En el Database Desktop pasa lo mismo si lo meto a mano. Key Violation. He vuelto a revisar por si hubiese metido alguna clave primaria (aunque sabia de antemano que no) y efectivamente todo sigue igual.
No sé que puede pasar. Alguna idea?
Todo lo que he leido sobre este error es en torno a claves primarias, así que no entiendo nada.
Lo mismo pasa si intento hacer un insert por SQL con 1 TQuery claro está....
Estoy desesperado. Se aceptan sugerencias.
Gracias a todos.
Responder Con Cita
  #2  
Antiguo 04-02-2005
Coco Coco is offline
Miembro
 
Registrado: jul 2004
Ubicación: Argentina
Posts: 83
Poder: 20
Coco Va por buen camino
Probastes con hacerle un pack a la tabla?
Responder Con Cita
  #3  
Antiguo 04-02-2005
mak8888 mak8888 is offline
Miembro
 
Registrado: sep 2003
Posts: 40
Poder: 0
mak8888 Va por buen camino
Hola Coco. La verdad es que no sé que es un pack, pero despues de trastear con la DB me dí cuenta que por algún motivo, se ha corrompido. He recuperado la copia de seguridad, a´si que solo he perdido el trabajo de 3 dias podia haber sido peor, la verdad.
Muchas gracias por todo.
Responder Con Cita
  #4  
Antiguo 04-02-2005
Coco Coco is offline
Miembro
 
Registrado: jul 2004
Ubicación: Argentina
Posts: 83
Poder: 20
Coco Va por buen camino
Lo que hace el pack exactamente es tratar de recuperar una tabla cuando esta corrupta. Esta funcion la provee el database desktop cuando entras a diseño de la estructura de una tabla, tienes un check para hacer pack a la tabla pones guardar los cambios y solucionado el problema. Tambien existen una librerias que te permiten hacer esto por codigo desde tu aplicacion simplemente instalando unas dlls.


Saludos
Responder Con Cita
  #5  
Antiguo 04-02-2005
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
Veo que al final lo has resuelto, primero acalarar que Pack lo que hace es eliminar definitivamente los registros que hayan sido borrados, ya que estos como el Dbase permanecen el la tabla aunque no se ven.

A mi me ha ocurrido alguna vez esto, la conclusión es que a veces por un fallo a pesar de la que un campo es clave única se repite, y entonces está dando errores de Key violation, en todo momento.

Recuerdo haberlo resuelto con una copia de la misma tabla vacía, con índices, y luego con el DatabaseDesktop le he añadido los registros de la que está dañada, de esta manera el que está dando el error no pasa y se soluciona.

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
  #6  
Antiguo 27-02-2005
Sick boy Sick boy is offline
Miembro
 
Registrado: may 2003
Ubicación: Cantabria
Posts: 245
Poder: 22
Sick boy Va por buen camino
Hola,

Lo que se rompio en tu tabla es el autoincremental.
Por algun motivo, volvio hacia atras, o dejo de crecer, por eso te da el error de key violation, porque se repite la clave primaria

Lo que dice marcos es correcto (alguien lo dudaba), y se soluciona porque desde una base de datos vacia el autoincremental esta correcto.

Por fin voy a poder agregar algo nuevo.
La base de datos se puede arreglar sin tener que pasar todos los registros a una nueva.

Usar el siguiente codigo, pasandole el nombre de la base de datos y el nuevo valor del autoincremental:

Código:
Procedure SetAutoInc(filename : string; Value : Longint);
var
   mystream : tfilestream;
begin
   mystream := tfilestream.create(filename,
   fmOpenWrite + fmShareExclusive);
   try
      mystream.Seek(73, soFromBeginning);
      mystream.Writebuffer(Value, SizeOf(Value));
   finally
      mystream.Free;
   end;
end;
Evidentemente, aseguraros de que el valor que pasais en Value es el mayor, u os encontrareis de nuevo con el mismo problema.

Saludos.

PD: Saludos tambien a marcos desde la tierruca, pasando un frio de cagarse.
Responder Con Cita
  #7  
Antiguo 27-02-2005
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
Pues también me ha ocurrido el caso del autoincrimento, ojo que también es un problema y gordo pues nos da error pero también nos elimina los registros.

Si el problema es de autoincremento, y creamos una tabla nueva y le pasamos los registros de la dañada, como la nueva parte de 0 al insertarle los registros el autoincremento supongamos que se pone en el número 5000, llegará un momento en que el autoincremento llegue a coincidir por el número que llevabamos en la otra tabla y entonces al agregar registros nuevos, nos eliminará uno de los antiguos y además nos enviará un error de Key violation, yo utilizo la función que se cita para poner el autoincremento de la tabla a 0 antes de añadirle los registros.

Devuelvo el saludo, pues ahora estoy de nuevo en mi tierra, pues he estado desde el jueves en Madrid por mor de una reunión.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
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


La franja horaria es GMT +2. Ahora son las 10:48:09.


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