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 Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-08-2012
Sapiem Sapiem is offline
Miembro
 
Registrado: abr 2007
Posts: 24
Poder: 0
Sapiem Va por buen camino
Error uso de sqlite3.dll por Zeos

Saludos:
Resulta que teniendo una sqlite3.dll en las carpetas del sistema (windows, system32, etc) tiene prioridad que la propia distribuida en nuestra aplicación que normalmente ponemos en la carpeta de nuestra app. Me he dado cuenta de esto puesto que la que tengo en la carpeta de mi app es la última de la distro del original sitio sqlite.com pero sin embargo cuando llamo la función para ver la versión (usando delphi, claro está) me informa que la versión es inferior, y esta corresponde con las dll distribuidas por otras aplicaciones como Opera, Adobe, etc ya previamente instaladas.

Cómo puedo obligar a Zeos a que utilice la dl que está en la carpeta de mi app y no en la que encuentre por defecto en las carpetas del sistema?

Gracias
Responder Con Cita
  #2  
Antiguo 06-08-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.037
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
En el título que has puesto (Error uso de sqlite3.dll por Zeos) haces mención a un error, ¿cual es?
Responder Con Cita
  #3  
Antiguo 06-08-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
El comportamiento que mencionas es raro porque, usualmente, el directorio de la aplicación tiene prioridad sobre cualquier otro directorio.

Como alternativa, lo único que se me ocurre es que coloques esta unidad en tu aplicación (pones la ruta adecuada en SQLite3DllLocation):

Código Delphi [-]
unit SqliteLoader;

interface

implementation

uses ZPlainSqlite3, ZPlainLoader;

const
  SQLite3DllLocation = 'c:\ruta\a\la\biblioteca\sqlite3.dll';

type
  {** Implements a loader for SQLite native library. }
  TZSQLiteNativeLibraryLoader = class(TZNativeLibraryLoader)
  public
    function Load: Boolean; override;
  end;

{ TZSQLiteNativeLibraryLoader }

function TZSQLiteNativeLibraryLoader.Load: Boolean;
begin
  Result := inherited Load;

{!}        @sqlite_open                   := GetAddress('sqlite3_open');
{!}        @sqlite_close                  := GetAddress('sqlite3_close');
{!}        @sqlite_column_count           := GetAddress('sqlite3_column_count');
{!}        @sqlite_column_bytes           := GetAddress('sqlite3_column_text');
{!}        @sqlite_column_name            := GetAddress('sqlite3_column_name');
{!}        @sqlite_column_decltype        := GetAddress('sqlite3_column_decltype');
{!}        @sqlite_exec                   := GetAddress('sqlite3_exec');
{!}        @sqlite_last_insert_rowid      := GetAddress('sqlite3_last_insert_rowid');
{!}        @sqlite_changes                := GetAddress('sqlite3_changes');
{!}        @sqlite_errmsg                 := GetAddress('sqlite3_errmsg');
{ ?-       @sqlite_last_statement_changes := GetAddress('sqlite3_last_statement_changes');}
{!}        @sqlite_interrupt              := GetAddress('sqlite3_interrupt');
{!}        @sqlite_complete               := GetAddress('sqlite3_complete');
{!}        @sqlite_busy_handler           := GetAddress('sqlite3_busy_handler');
{!}        @sqlite_busy_timeout           := GetAddress('sqlite3_busy_timeout');
{!}        @sqlite_get_table              := GetAddress('sqlite3_get_table');
{!}        @sqlite_free_table             := GetAddress('sqlite3_free_table');
{!}        @sqlite_freemem                := GetAddress('sqlite3_free');
{!}        @sqlite_libversion             := GetAddress('sqlite3_libversion');
{ ?-       @sqlite_libencoding            := GetAddress('sqlite3_libencoding');
{ ?-       @sqlite_create_function        := GetAddress('sqlite3_create_function');}
{ ?-       @sqlite_create_aggregate       := GetAddress('sqlite3_create_collation');}
{ ?-       @sqlite_function_type          := GetAddress('sqlite3_function_type');
{!}        @sqlite_set_result_string      := GetAddress('sqlite3_result_string');
{!}        @sqlite_set_result_int         := GetAddress('sqlite3_result_int');
{!}        @sqlite_set_result_double      := GetAddress('sqlite3_result_double');
{!}        @sqlite_set_result_error       := GetAddress('sqlite3_result_error');
{!}        @sqlite_user_data              := GetAddress('sqlite3_user_data');
{!}        @sqlite_aggregate_context      := GetAddress('sqlite3_aggregate_context');
{!}        @sqlite_aggregate_count        := GetAddress('sqlite3_aggregate_count');
{!}        @sqlite_set_authorizer         := GetAddress('sqlite3_set_authorizer');
{!}        @sqlite_trace                  := GetAddress('sqlite3_trace');
{!}        @sqlite_compile                := GetAddress('sqlite3_prepare');
{!}        @sqlite_step                   := GetAddress('sqlite3_step');
{!}        @sqlite_finalize               := GetAddress('sqlite3_finalize');
{!}        @sqlite_reset                  := GetAddress('sqlite3_reset');
{ ?-       @sqlite_bind                   := GetAddress('sqlite3_bind');}
{!}        @sqlite_progress_handler       := GetAddress('sqlite3_progress_handler');
{!}        @sqlite_commit_hook            := GetAddress('sqlite3_commit_hook');
{ ?-       @sqlite_open_encrypted         := GetAddress('sqlite3_open_encrypted');}
{!}        @sqlite_rekey                  := GetAddress('sqlite3_rekey');
{!}        @sqlite_key                    := GetAddress('sqlite3_key');
end;

initialization
  if Assigned(ZPlainSqlite3.LibraryLoader) then
    ZPlainSqlite3.LibraryLoader.Free;

  ZPlainSqlite3.LibraryLoader :=
    TZSQLiteNativeLibraryLoader.Create([SQLite3DllLocation]);
end.

Básicamente, esta unidad "copia" lo que hace la unidad ZPlainSqlite3 que es donde se carga la biblioteca de sqlite.

// Saludos
Responder Con Cita
  #4  
Antiguo 06-08-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Otra forma, menos drástica que la anterior:

Importas la función SetDllDirectory (al menos en Delphi 7 no está importada, posiblemente en versiones posteriores ya lo esté)

Código Delphi [-]
function SetDllDirectory(lpPathName: LPCTSTR):LongBool; stdcall; external 'kernel32.dll' name 'SetDllDirectoryA';

Y, antes de abrir la conexión, la usas para agregar el directorio deseado a la búsqueda de dllls:

Código Delphi [-]
SetDllDirectory('c:\rura\a\la\biblioteca\');

Tal como dice la documentación de SetDllDirectory, la ruta que pongas tendrá preferencia sobre cualquier otra, excepto la de la aplicación.

// Saludos
Responder Con Cita
  #5  
Antiguo 09-08-2012
Sapiem Sapiem is offline
Miembro
 
Registrado: abr 2007
Posts: 24
Poder: 0
Sapiem Va por buen camino
Gracias por las respuestas

Saludos.

A mi también me sorprende que ocurra esta situación con la dll de la misma carpeta, pero lo probé en varias ocasiones, incluso en una PC Virtual virgen que tengo y entonces es como único reconoce la dll de la carpeta, puesto que en el sistema no hay ninguna.

Ok, trataré de utilizar ambas variantes. Ya me había metido en la unidad que mencionas, pero no me atreví a modificar nada.

Sobre la segunda variante, me preocupa que estableciendo esta dirección como preferencial, las app no me quieran reconocer otras dll del sistema que usamos cotidianamente y quizás no nos demos cuenta que se usan (printers, etc). Aunque no creo que esto sea una limitación, pues si no encuentra nada en mi carpeta, saltaría entonces para la del sistema, pienso que sea así..

Muchas gracias

Luego les comento como me fue.
Responder Con Cita
  #6  
Antiguo 09-08-2012
Sapiem Sapiem is offline
Miembro
 
Registrado: abr 2007
Posts: 24
Poder: 0
Sapiem Va por buen camino
Se me olvidó decirles que ahora estoy usando el ZEOSDBO-7.0.0-alpha

Muchas gracias
Responder Con Cita
  #7  
Antiguo 13-08-2012
ElMug ElMug is offline
Miembro
NULL
 
Registrado: jul 2012
Posts: 163
Poder: 12
ElMug Va por buen camino
Esta alternativa, simple, tal vez te funcione, Sapiem:

Pongo esto como primera linea en onFormCreate:

////SQLITE3 VERSION ...........................
SQLiteLibraryName:='sqlite3.dll';
////...........................................

y como no tiene "path", usa el sqlite3.dll que esta en el directorio del proyecto, y es el mismo .dll que acompaña al .exe resultante, tambien en su mismo folder.

Tambien tengo el mismo .dll en el folder donde esta instalado Lazaro (en mi caso).

Si quieres aun mas control, le puedes cambiar el nombre al .dll (en la aplicacion) siempre y cuando coincida con el nombre en el codigo mostrado.
Responder Con Cita
  #8  
Antiguo 14-08-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿Dónde está declarada la variable SQLiteLibraryName?

// Saludos
Responder Con Cita
  #9  
Antiguo 14-08-2012
ElMug ElMug is offline
Miembro
NULL
 
Registrado: jul 2012
Posts: 163
Poder: 12
ElMug Va por buen camino
Cita:
Empezado por roman Ver Mensaje
¿Dónde está declarada la variable SQLiteLibraryName?

// Saludos

Es interna en Lazarus. No tengo que declararla antes. Tal vez sea parte de instalar el paquete SQlite3.
Responder Con Cita
  #10  
Antiguo 14-08-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Es que a mi me da el error "Identifier not found"

// Saludos
Responder Con Cita
  #11  
Antiguo 14-08-2012
ElMug ElMug is offline
Miembro
NULL
 
Registrado: jul 2012
Posts: 163
Poder: 12
ElMug Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Es que a mi me da el error "Identifier not found"

// Saludos
En delphi o en Lazarus?

En Lazarus, realmente es una propiedad de SQLite3.Connection, pero no es visible en diseño.

Asi que lo que mencione, depende de que se use ese componente.

Me interesa saber que componente usan para la conexion con SQLite3, si viene ya en Delphi, o es externo, pues me intersaria probar otros, si acaso no sea ese componente el que me cause ciertos prolbemas.
Responder Con Cita
  #12  
Antiguo 14-08-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Sí, ya vi. Está definida en la sección interface de la unidad sqlite3conn. Pero esto es para los componentes que vienen con Lázarus, no sirve para Zeos. La variable equivalente en zeos está definida en una sección implementation por lo que no puede modificarse.

// Saludos
Responder Con Cita
  #13  
Antiguo 16-08-2012
Sapiem Sapiem is offline
Miembro
 
Registrado: abr 2007
Posts: 24
Poder: 0
Sapiem Va por buen camino
Sobre SQLiteLibraryName

Entonces no hay SQLiteLibraryName o algo similar para Delphi, porque me interesa eso de poder también asignarle otro nombre a la dll.
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
Desactivar journal con ZeosBD y Sqlite3 fide_uci Conexión con bases de datos 1 21-05-2012 16:29:47
Ayuda con Insercion lentisima en SQLite3 fide_uci Conexión con bases de datos 4 19-01-2012 03:55:52
¿como compilar sqlite3.dll ? JXJ C++ Builder 2 07-12-2010 22:37:50
SQLite3 devuelve 01-01-1899 salvica SQL 3 03-02-2010 11:56:55
acceso a datos sqlite3 lazarus anubis Lazarus, FreePascal, Kylix, etc. 2 10-12-2009 18:12:29


La franja horaria es GMT +2. Ahora son las 13:40: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
Copyright 1996-2007 Club Delphi