Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-10-2011
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Novato en Firebird

Hola a todos.
Estoy haciendo una aplicación que debe funcionar en MySql / Firebird / SQLite3
mediante D-7, ZeosDBO 6.6.6 estable y Firebird Server 2.5.1

Intento hacer ésta consulta para Firebird
Código SQL [-]
SELECT COUNT(*) AS existe
  FROM rdb$relations
 WHERE rdb$relation_name = 'MITABLA'
   AND rdb$view_blr is null
   AND (rdb$system_flag is null OR rdb$system_flag=0);
y obtengo éste error:
raised exception class EAccessViolation with message 'Access violation at address 00000000'.

La dichosa consulta debe devolver la existencia de una tabla (es este caso MITABLA) y la creo con esta función:
Código Delphi [-]
  function  FIREBIRD_ExisteTabla( ZQuery:TZQuery; TableName:string;
                                  PathSqlError:string ):boolean;
  begin
    Result := false;
    with ZQuery do begin
         Active := false;
         SQL.Clear;
         SQL.Add( 'SELECT COUNT(*) AS existe' );
         SQL.Add( '  FROM rdb$relations' );
         SQL.Add( ' WHERE rdb$relation_name = '''+UpperCase(TableName)+'''' );
         SQL.Add( '   AND rdb$view_blr is null' );
         SQL.Add( '   AND (rdb$system_flag is null OR rdb$system_flag=0);'  );
         try
           Open; <------ AQUÍ "CASCA" 
           Result := ( FieldByName('EXISTE').AsInteger>0 );
         { cerrar la ZQuery }
           Close;
         except
           SQL.SaveToFile( PathSqlError+'\ERROR_FIREBIRD_ExisteTabla_'+TableName+'.sql' );
         end;
    end; { del with ZQuery do }
  end;
¿Podeis decirme qué estoy haciendo mal?
La consulta es adaptada de esta que encontré en internet.

Gracias de antemano
salvica
Responder Con Cita
  #2  
Antiguo 31-10-2011
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
Hola.

Si has probado a ejecutar la select desde IBExpert, IBConsole o similar y no te ha dado problemas,
yo probaría a usar QuotedStr(), por si fuese problema de las comillas.

Código Delphi [-]
SQL.Add( ' WHERE rdb$relation_name = '+QuotedStr(UpperCase(TableName)));

PD: Mejor pásalo como parámetro
Código Delphi [-]
SQL.Add( ' WHERE rdb$relation_name = :Mitabla ');
...
...
ParamByName('Mitabla').AsString := Tablename;
Open;
__________________
Progress Openedge
https://abevoelker.com/progress_open...dered_harmful/


Delphi forever...
Responder Con Cita
  #3  
Antiguo 31-10-2011
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Hola defcon1_es, gracias por responder.

Lo he cambiado a parámetros y sigue dando el mismo error.

La consulta la ejecuto en el FlameRobin y funciona correctamente, no sé lo que demonios puede ocurrir.

Saludos
salvica
Responder Con Cita
  #4  
Antiguo 31-10-2011
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
El problema con el EAccesViolation es que es muy poco dicientes, lo que se me viene a la mente es que el problema no es de la consulta como tal, más bien diría que es del componente, o del valor que se esta enviando en TableName, busca una herramienta de debugger (algo así como el eurekaLog) ese puede dar mejores datos que el simple EAccesViolation
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #5  
Antiguo 31-10-2011
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Hola RONPABLO, buenas noches.

Antes de abrir la consulta, (para comprobar), la salvo en un fichero:
Código SQL [-]
SQL.SaveToFile( PathSqlError+'\FIREBIRD_ExisteTabla_'+TableName+'.sql' );
try
  Open;
except
  SQL.SaveToFile( PathSqlError+'\ERROR_FIREBIRD_ExisteTabla_'+TableName+'.sql' );
end;
y el resultado es la misma que pongo al principio
Código SQL [-]
SELECT COUNT(*) AS existe
  FROM rdb$relations
 WHERE rdb$relation_name = 'MITABLA'
   AND rdb$view_blr is null
   AND (rdb$system_flag is null OR rdb$system_flag=0);
Esta misma consulta (con las adaptaciones correspondientes), la tengo para MySql y para SQLite3.

El error en sí no dice nada, pero si corro la consulta sobre FlameRobin o sobre SQL Maestro funciona correctamente, así que supongo que el error es de Firebird.

Si en la consulta cambio "MITABLA" por "mitabla", me devuelve CERO (no existe)

Por cierto, ya que estamos
¿Sabes como se configura el servidor para que admita mayúsculas y minúsculas en lo nombres de campo?
Cuando yo creo las tablas, los nombres de tabla los pongo en minúsculas y los nombres de campo en mayúsculas (cosas de la edad ), pero Firebird 2.5 lo cambia TODO a mayúsculas.

Gracias por lo que puedas ayudarme y perdona por el "rollo" que te he metido, pero estoy hasta los c****es de los diferentes formatos de SQL

Saludos
salvica
Responder Con Cita
  #6  
Antiguo 31-10-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola salvica.

Cita:
El error en sí no dice nada, pero si corro la consulta sobre FlameRobin o sobre SQL Maestro funciona correctamente, así que supongo que el error es de Firebird.
No uso Zeos por lo que no tengo manera de probarlo, pero creo que el error es debido al componente TZQuery y no a Firebird, ya que hice una prueba usando TIBQuery y me funciona correctamente:
Código Delphi [-]
function TForm1.ExisteTabla(Nombre: string): boolean;
begin
  with TIBQuery.Create(nil) do
  try
    Database:= IBDatabase1;
    SQL.Clear;
    SQL.Add('SELECT COUNT(*) AS FOUND');
    SQL.Add('FROM RDB$RELATIONS');
    SQL.Add('WHERE RDB$RELATION_NAME = :TABLA AND RDB$VIEW_BLR IS NULL');
    SQL.Add('AND (RDB$SYSTEM_FLAG IS NULL OR RDB$SYSTEM_FLAG = 0)');
    ParamByName('TABLA').AsString:= Nombre;
    Open;
    Result:= FieldByName('FOUND').AsInteger > 0;
    Close;
  finally
    Free;
  end;
end;

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 31-10-2011
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Esa consulta la corro directamente sobre firebird y funciona bien osea que error de firebird no es, y con el resultado que envía se nota que el valor de "TableName" llega bien, por lo cual yo me centraría en buscr el error por los componentes ZeoMDO, de pronto hace alguna validación en la estructura del query y no soporta hacer consultas en tablas del sistema en firebird... Por curiosidad, la consulta:

Código SQL [-]
SELECT COUNT(*) AS existe   
FROM rdb$relations  WHERE rdb$relation_name = 'MITABLA'    
AND rdb$view_blr is null    
AND (rdb$system_flag is null OR rdb$system_flag=0);

Prueba a quitar el ";" del final, el componente no debe de necesitarlo al final y de pronto saca erro por tenerlo..




Respecto a usar Nombres de campos o de tablas en mayúsculas o minúsculas puede hacerlo desde comandos encerrando el nombre de la tabla o el campo entre comilla doble, aunque es muy dispendioso hacerlo así ya que de ahí en adeltante deberá hacer las consultas de esa misma forma. ejemplo:


Código SQL [-]
Create Table "Tabla1"....
....
....
select "Campo1" from "Tabla1"
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"

Última edición por RONPABLO fecha: 31-10-2011 a las 22:05:51.
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
Novato: Guardar a Firebird desde un edit juanmfer2002 Firebird e Interbase 2 09-03-2008 18:22:59
Novato en firebird ckaki Firebird e Interbase 2 01-07-2006 12:00:00
Novato en Firebird Delphos Firebird e Interbase 5 21-01-2005 17:07:47
Novato en firebird, tengo una duda chakal Firebird e Interbase 2 03-03-2004 13:48:49
Novato en Firebird y IB( Que sera mejor para agregar, Modificar, ect) IcebergDelphi Firebird e Interbase 2 04-06-2003 05:56:16


La franja horaria es GMT +2. Ahora son las 10:13:23.


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