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 02-04-2008
PaCmAn72 PaCmAn72 is offline
Registrado
 
Registrado: abr 2007
Posts: 8
Poder: 0
PaCmAn72 Va por buen camino
Crear dll con acceso a base de datos

Hola a todos:
tengo que crear una dll que acceda mediante odbc a una base de datos.
He creado la dll y dentro de ella un tdatamodule en el que pongo la base de datos y la tquery para realizar una consulta.
El problema esta cuando intento llamar al tmodule para abrir la base de datos o para hacer cualquier cosa porque me da un error de memoria.
Me gustaria saber si me podeis ayudar a crear esa conexion a la base de datos dentro de mi dll.
Muchas gracias por adelantado y un saludo.
Responder Con Cita
  #2  
Antiguo 02-04-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 24
ContraVeneno Va por buen camino
Lo que pasa es que cuando ejecutas tu DLL, el DataModule no se crea automáticamente. Tienes que indicarle a tu proyecto que cree el DataModule automáticamente, o si es necesario, crearlo tu mismo en algún evento.

Algo como:
Código Delphi [-]
library TuDll;

uses
  Windows,
...
  Datamodule1 in '\\TuDll\Datamodule.pas' {DataModule1: TDataModule},
...

{$R *.RES}


begin
...
   Application.CreateForm(TDatamodule1, Datamodule1);
...
end.
__________________

Responder Con Cita
  #3  
Antiguo 02-04-2008
PaCmAn72 PaCmAn72 is offline
Registrado
 
Registrado: abr 2007
Posts: 8
Poder: 0
PaCmAn72 Va por buen camino
Lo he hecho asi:

library prueba;
{ comentario borrado }
uses
Windows,
SysUtils,
Classes,
Dialogs,
udatos in 'udatos.pas' {Datos: TDataModule};
{$R *.res}
function multiplica(a : integer; b : integer) : integer; stdcall;
begin
multiplica := a * b;
end;
function obtenerNombre(codigo : shortstring) : shortstring; stdcall;
var
temporal : shortstring;
begin
Application.CreateForm(datos, udatos);

datos.consulta.ParamByName('codigo').AsInteger := strtoint(codigo);
datos.consulta.Active := true;
if datos.consulta.RecordCount = 0 then temporal := '-'
else temporal := datos.consulta['pe_apelli'];
datos.consulta.Active := false;
obtenerNombre := temporal;
end;
exports
multiplica, obtenerNombre;
begin
end.


y me da un error en la linea que me has dicho que ponga.
No me funciona.
Responder Con Cita
  #4  
Antiguo 03-04-2008
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Algo de explicación conceptual

Hola,

Un DLL se maneja diferente a una aplicación. Cuando usas un TDataModule tanto la creación del mismo como su destrucción debes hacerlo por tí mismo. Digamos que agregastes una unidad en la que creates tú TDataModule; ten en cuenta que al hacerlo, en realidad lo que estás definiendo es una clase descendiente de TDataModule, a la que llamastes Datos. Tú unidad debe lucir algo como esto:

Código Delphi [-]
type
  TDatos = class(TDataModule)
  Private
      FAlgo: Integer; 
  Public
      Property Algo:Integer Read FAlgo Write FAlgo;
  End;
 
Var 
    Datos: TDatos;

Lógicamente "Algo" es solo un ejemplo.

Hay varias consideraciones de metodología a hacer. Sin entrar en detalles, es aconsable borrar el :

Código Delphi [-]
 
Var 
    Datos: TDatos;

De la unidad que has creado, y en su lugar emplearlo como variable local de la rutina que deba usarla; esto es para facilitar programación multihilos en caso de que más adelante se desarrolle con ella.

Las rutina que la use debe ser algo como esto:

Código Delphi [-]
Function HacerAlgo(ACode:Integer):Integer;
Var 
    Datos: TDatos;  
Begin
       Datos := Nil;
       Try
           Datos := TDatos.Create(Nil);
           Datos.Algo := ACode;
           ....
           HacerAlgo := Datos.Algo;
       Finally
           Datos.Free; 
       End;
End;

El parámetro Nil del constructor le dice a la rutina que la responsabilidad de liberar al componente es de la propia rutina. Es importante que tengas en cuenta que aquí no puedas pasarle un parámetro Self, u otro componente, proveniente del programa principal porque se trata de áreas de memoria diferentes.

Bueno, hay bastante teoría que podríamos anotar al respecto; pero espero que esto te ayude a orientarte.

Ahora bien, te sugiero leer primero toda la teoría de manejo de DLLs y en especial la comunicación de parámetros entre el programa principal y el DLL, así como lo referente a manejo de memoria.

Última edición por rolandoj fecha: 03-04-2008 a las 00:56:25. Razón: Problema con las banderas de código Delphi
Responder Con Cita
  #5  
Antiguo 03-04-2008
PaCmAn72 PaCmAn72 is offline
Registrado
 
Registrado: abr 2007
Posts: 8
Poder: 0
PaCmAn72 Va por buen camino
Muchas gracias rolandoj. Me has aclarado un monton de dudas. Es que es la primera dll que creo en mi vida y la verdad es que ando un poco perdido.
Ha funcionado a la perfeccion.
Muchas gracias de nuevo y un saludo.
Responder Con Cita
  #6  
Antiguo 03-04-2008
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Smile Me alegro. A la orden para cualquier otra cosa

Cita:
Empezado por PaCmAn72 Ver Mensaje
Muchas gracias rolandoj. Me has aclarado un monton de dudas. Es que es la primera dll que creo en mi vida y la verdad es que ando un poco perdido.
Ha funcionado a la perfeccion.
Muchas gracias de nuevo y un saludo.
Hola,

Me alegro que haya podido serte útil y quedo a la orden en caso de que necesites más ayuda.

Este tema de los DLL tiene bastante detalles. Te podrás dar cuenta a medida que investigues al respecto.

Muchos saludos
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
Problema de acceso a base de datos Access Ulnaju Tablas planas 6 15-08-2007 01:53:13
Acceso a base de datos interbase/firebird Ricardo León Conexión con bases de datos 4 12-09-2006 20:31:05
Acceso a Base Datos de Micro. Works con delphi jfk76 Servers 2 03-03-2005 18:44:48
BDE para acceso a una Base de Datos Oracle Isabel Oracle 2 12-06-2003 12:05:01
Acceso a Base de datos Oracle con BDE Isabel Conexión con bases de datos 3 04-06-2003 17:52:06


La franja horaria es GMT +2. Ahora son las 13:45:37.


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