Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   SQLQuery no encuentra una tabla (https://www.clubdelphi.com/foros/showthread.php?t=93134)

Arturo.Molina 28-05-2018 15:57:54

SQLQuery no encuentra una tabla
 
Hola a todos,
en un pequeño proyecto que estoy haciendo en Delphi 10.2, estoy usando una base de datos SQLite3 que tiene 2 tablas (libros y ventas).

Para atacarla, he colocado un SQLConnection y un SQLQuery, ambos de DBExpress.
Tengo en el directorio de la aplicación el archivo sqlite3.dll versión 3.23.0100, descargado esta misma mañana.
La conexión usa el driver sqlite, le coloco como parámetro la dirección de la base de datos y conecto:
Código Delphi [-]
procedure TDM.DataModuleCreate(Sender: TObject);
begin
   Conexion.LoginPrompt := false;
   Conexion.DriverName := 'sqlite';
   Conexion.Params.Add( 'Directorio = ' + ExtractFilePath( ParamStr(0) ) + 'feria.db' );
   try
     Conexion.Open;
   except
     on E: Exception do
       ShowMessage( 'Hubo un error al conectar con la base de datos' );
   end;
 end;
Hasta aquí, sin problemas.
Para obtener los datos, uso el SQLQuery así:
Código Delphi [-]
procedure TfAgregarLibros.edtISBNExit(Sender: TObject);
begin
   if edtISBN.Text <> '' then     // Buscamos si existe el libro
     if DM.QueryLibros.Active then
       Close;
     DM.QueryLibros.SQL.Clear;
     DM.QueryLibros.SQL.Add( 'SELECT * FROM libros WHERE isbn = :isbn1;' );
     DM.QueryLibros.Params.ParamByName( 'isbn1' ).AsString := edtISBN.Text;
     DM.QueryLibros.Active := true;
     ...

Y aquí me salta un error diciendo que no encuentra la tabla "libros"...
¿Álguien sabe que estoy haciendo mal?

duilioisola 28-05-2018 16:43:17

Para empezar deberías asegurarte de que está atacando a la base de datos que supones.
Bastaría con poner un Label.
Código Delphi [-]
Conexion.Params.Add( 'Directorio = ' + ExtractFilePath( ParamStr(0) ) + 'feria.db' );
LConexion.Caption := 'Directorio = ' + ExtractFilePath( ParamStr(0) ) + 'feria.db';

También puedes ver si en ese punto la conexión está activa. (Justo antes de hacer la consulta)
Código Delphi [-]
procedure TfAgregarLibros.edtISBNExit(Sender: TObject);
begin
   if edtISBN.Text <> '' then     // Buscamos si existe el libro
     if DM.Consexion.Active then
     begin
        if DM.QueryLibros.Active then
        [...]
     end
     else
        // Mensaje de error: La conexión no está activa

Por otro lado deberías asegurarte de que que la tabla exista en esa base de datos mediante otra herramienta.

¿Cuál es el mensaje de error, sin traducir ni interpretar, que te da la aplicación y en qué punto de la aplicación exactamente?
¿Puede ser que sea CASE SENSITIVE y la tabla se llame LIBROS o Libros?
¿Estás ejecutando la aplicación desde una unidad de red? Después de la actualización de Windos10 esto puede darte problemas.

No tengo experiencia con SQLLite específicamente, pero estas son algunas cosas que se me ocurren...

Arturo.Molina 29-05-2018 09:29:50

Cita:

Empezado por duilioisola (Mensaje 526605)
Para empezar deberías asegurarte de que está atacando a la base de datos que supones.
Bastaría con poner un Label.


También puedes ver si en ese punto la conexión está activa. (Justo antes de hacer la consulta)


Por otro lado deberías asegurarte de que que la tabla exista en esa base de datos mediante otra herramienta.


¿Cuál es el mensaje de error, sin traducir ni interpretar, que te da la aplicación y en qué punto de la aplicación exactamente?
¿Puede ser que sea CASE SENSITIVE y la tabla se llame LIBROS o Libros?


¿Estás ejecutando la aplicación desde una unidad de red? Después de la actualización de Windos10 esto puede darte problemas.
No tengo experiencia con SQLLite específicamente, pero estas son algunas cosas que se me ocurren...


Hola duilioisola, gracias por tu interés.
Antes de responderte (no te ofendas, no lo digo con ningún tipo de acritud) te comento que llevo ya unos cuantos años desarrollando con Delphi y Lazarus, aunque perdí mi cuenta de Club Delphi y por eso aparezco sin post.

Sí, está comprobado que la base de datos es esa, que contiene la tabla "libros", que está en el sitio adecuado, y verificado con una utilidad externa, y no, no es case sensitive. La aplicación será de escritorio, nada de red (hubiera usado un SGBD diferente). También he comprobado si estaba activa la conexión antes de activar el query.

El mensaje de error, sin traducir ni interpretar, es:

Project Feria.exe raised exception class TDBXError with message 'no such table: libros'.

Acabo de comprobar que, en diseño, si establezco las propiedades correspondientes, tanto la conexión como el query se activan sin problemas y el sistema funciona, devolviendo los datos correctos... ????????

Casimiro Notevi 29-05-2018 10:38:47

¿Lo has seguido paso a paso con el depurador hasta que hace la conexión?
Por lógica, si no encuentra la BD es que está en otro sitio, o es otra, o no tiene permisos para acceder a ese directorio.
Eso es independiente de la experiencia de cada uno :D

Arturo.Molina 29-05-2018 10:51:22

Cita:

Empezado por Casimiro Notevi (Mensaje 526638)
¿Lo has seguido paso a paso con el depurador hasta que hace la conexión?
Por lógica, si no encuentra la BD es que está en otro sitio, o es otra, o no tiene permisos para acceder a ese directorio.
Eso es independiente de la experiencia de cada uno


Gracias Casimiro.

Sí, el depurador salta justo al intentar activar el query, y el problema no es la base de datos, la encuentra, y el SQLConnectrion la abre sin problemas, el fallo es que no encuentra la tabla libros dentro de la base de datos (que por supuesto existe y contiene datos).
Lo que más me sorprende es que no falle poniendo las propiedades en tiempo de diseño.

Saludos

Casimiro Notevi 29-05-2018 11:18:17

Qué cosa tan extraña.
Prueba a cambiarle el nombre a la tabla.
Luego crea una nueva tabla libros.


O también genera una nueva base de datos, a ver si hay algún espacio o caracter "raro" por ahí.

Arturo.Molina 29-05-2018 13:47:58

Cita:

Empezado por Casimiro Notevi (Mensaje 526644)
Qué cosa tan extraña.
Prueba a cambiarle el nombre a la tabla.
Luego crea una nueva tabla libros.


O también genera una nueva base de datos, a ver si hay algún espacio o caracter "raro" por ahí.


Nada Casimiro, que no hay manera.
He creado varias veces la base de datos con nombres diferentes, con la tabla he hecho igual. He colocado sqlite3.dll en el directorio de la aplicación, en el system32 de windows, borrado, descargado de nuevo (por si estuviera corrupto)...
He borrado toda los archivos de la aplicación y he reiniciado el pc, he creado un nuevo proyecto solo con el acceso a la base de datos, y hace exactamente lo mismo.
Si coloco las propiedades en tiempo de diseño, funciona sin problemas, si lo hago en tiempo de ejecución, no encuentra la tabla

Arturo.Molina 29-05-2018 14:09:00

Bueno, por fin he localizado el problema, parece mentira la de dolores de cabeza que puede dar una tontería.

Coloco la solución, por si a álguien le pasa alguna vez lo mismo:
La línea:
Código Delphi [-]
Conexion.Params.Add( 'Database = ' + ExtractFilePath( ParamStr(0) ) + 'feria.db' );

tiene un error de concepto (fallo mío, por el sistema de codificación que uso)

Debería ser así:
Código Delphi [-]
Conexion.Params.Add( 'Database=' + ExtractFilePath( ParamStr(0) ) + 'feria.db' );


Por si no lo notais, os diré que los espacios que hay antes y después de signo igual eran los que estaban fastidiando.
Gracias a los dos por vuestro interés Casimiro y duilioisola

Saludos a todos


La franja horaria es GMT +2. Ahora son las 23:04:52.

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