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 Temas de Hoy

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: 23
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



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 14:20:06.


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