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 05-03-2013
Eduardo Mendoza Eduardo Mendoza is offline
Registrado
 
Registrado: jun 2006
Posts: 2
Poder: 0
Eduardo Mendoza Va por buen camino
Pasar un componente TDataBase a otra aplicacion en delphi

Hola gente espero que alguien me pueda ayudar con algun tip, tengo una aplicacion en Delphi 2007 donde me conecto a una base de datos (Oracle) esta aplicacion toma algunas desiciones y dependiendo de esto ejecuta otro programa que utiliza la misma conexión, sin embargo no quiero abrir mas sesiones a la base de datos por efecto de eficientar los recursos. Conocen alguna manera sencilla de pasarle este componente ya instanciado a esta segunda aplicación?
Responder Con Cita
  #2  
Antiguo 05-03-2013
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 Eduardo y bienvenido a Club Delphi

Como a todos los que se inician te invitamos a que leas nuestra guía de estilo.

Cita:
Conocen alguna manera sencilla de pasarle este componente ya instanciado a esta segunda aplicación?
Hasta donde sé no veo manera de enviar a otra aplicación una instancia en sí misma, ya que esta carecería de espacio o validez fuera del entorno de la primera. En cambio si es posible enviar los datos de dicha instancia u objeto.

Un modo sencillo que se me ocurre es guardar el componente desde la aplicación emisora y luego leerlo desde el componente de la aplicación receptora.

Aplicación emisora:
Código Delphi [-]
procedure SaveComponentToFile(aComponent: Tcomponent; aFileName: TFilename);
begin
  with TFileStream.Create(aFileName, fmCreate) do
  try
    WriteComponent(aComponent)
  finally
    Free
  end;
end;

Aplicación receptora:
Código Delphi [-]
procedure ReadComponentFromFile(aComponent: TComponent; aFileName: TFilename);
begin
 with TFileStream.Create(aFileName, fmOpenRead) do
  try
    ReadComponent(aComponent)
  finally
    Free;
  end;
  DeleteFile(aFileName); // (si deseas eliminarla)
end;
Pero no se evita el uso de otra instancia de la misma clase en la segunda aplicación.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 05-03-2013
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 913
Poder: 23
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Cita:
Empezado por Eduardo Mendoza Ver Mensaje
Hola gente espero que alguien me pueda ayudar con algun tip, tengo una aplicacion en Delphi 2007 donde me conecto a una base de datos (Oracle) esta aplicacion toma algunas desiciones y dependiendo de esto ejecuta otro programa que utiliza la misma conexión, sin embargo no quiero abrir mas sesiones a la base de datos por efecto de eficientar los recursos. Conocen alguna manera sencilla de pasarle este componente ya instanciado a esta segunda aplicación?
Creo que compartir la conexión entre aplicaciones no se podría, Pero entre una Aplicación y una DLL si se puede...
Esto va a depender de si tú segunda aplicación la puedes convertir en una DLL.

La idea es que la función que llames desde la DLL tiene que recibir el puntero a la conexión de la base de datos...

Código Delphi [-]
{-----------------------------------------------------------------------}
{                          START DLL CODE                               }
{-----------------------------------------------------------------------}

library testdll;

uses
   bde, db, dbtables, dialogs;

procedure myDLLCall(dbHandle : hdbidb); stdcall;
var
   Database : TDatabase;
   Query  : TQuery;
begin
   Database := TDatabase.Create(nil);
   try
      Database.DatabaseName := 'Brad';  {Some New DBName ie Alias}
      Database.Handle := dbHandle;
      Query := TQuery.Create(nil);
      try
         Query.DatabaseName := Database.DatabaseName;
         Query.Close;
         Query.SQL.Clear;
         Query.SQL.Add('SELECT SYSDATE FROM DUAL');
         Query.Open;
         ShowMessage(Query.FieldByName('SYSDATE').AsString);
      finally
         Query.Free;
      end;
   finally
      Database.Free;
   end;

exports
   myDllCall;

begin
end.


{-----------------------------------------------------------------------}
{                            START APP CODE                             }
{-----------------------------------------------------------------------}
unit appl;

uses
   Windows, Messges, SysUtils, Classes, Graphics, Contrils,
   Forms, Dialogs, StdCtrls, DB, BDE;

type
   TForm1 = class(TForm)
       dbOracle : TDatabase;
       Button1 : TButton;
       procedure Button1Click(Sender : TObject);
   end;

var
   Form1 : TForm;

procedure myDllCall(dbHandle : hdbidb); stdcall; external 'TESTDLL.DLL'

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender : TObject);
begin
   dbOracle.Open;
   myDllCall(dbOracle.Handle);
end;

Buscando entre mis cachureos encontre este código...Nunca lo he usado...
Espero te ayuda...

Yo lo realizo con componentes IBX y FIBPLus atacando Firebird....

Saludos cordiales
Responder Con Cita
  #4  
Antiguo 06-03-2013
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 Eduardo.

Sobre tu consulta (usando COPYDATASTRUCT), tratándose de un TComponent, lamentablemente creo nos deja en una situación similar a la anterior por los motivos explicados.

Pero, aunque de forma mas compleja que con TFileStream, se pueden pasar los datos de la instancia, un ejemplo:

Aplicación emisora:
Código Delphi [-]
...
type
  TfrmEmisor = class(TForm)
    Button1: TButton;
    Database1: TDatabase;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;

var
  frmEmisor: TfrmEmisor;

implementation

type
  TDBRegister = packed record
    AliasName    : string[255];
    Connected    : Boolean;
    DatabaseName : string[255];
    DriverName   : string[255];
    Exclusive    : Boolean;
    //...
  end;

procedure TfrmEmisor.Button1Click(Sender: TObject);
var
  CDS : COPYDATASTRUCT;
  H   : HWND;
  R   : TDBRegister;
begin
  with Database1 do
  begin
    R.AliasName      := AliasName;
    R.Connected      := Connected;
    R.DatabaseName   := DatabaseName;
    R.DriverName     := DriverName;
    R.Exclusive      := Exclusive;
   //...
  end;
  H := FindWindow(PChar('TfrmRecept'),PChar('TITULO'));
  try
    CDS.dwData := 0;
    CDS.cbData := SizeOf(R);
    CDS.lpData := @R;
    SendMessage(H, WM_COPYDATA, Integer(Handle), Integer(@CDS));
  finally
    CloseHandle(H);
  end;
end;
end.

Aplicación receptora:
Código Delphi [-]
...
type
  TfrmRecept = class(TForm)
    Database1: TDatabase;
    Memo1: TMemo;
  private
    procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
  public
  end;

var
  frmRecept: TfrmRecept;

implementation

type
  TDBRegister = packed record
    AliasName    : string[255];
    Connected    : Boolean;
    DatabaseName : string[255];
    DriverName   : string[255];
    Exclusive    : Boolean;
    // ...
  end;

procedure TfrmRecept.WMCopyData(var Msg: TWMCopyData);
const
   BOOLVALUE : array[Boolean] of string = ('False','True');
begin
  with TDBRegister(Msg.CopyDataStruct.lpData^) do
  begin
    Database1.AliasName      := AliasName;
    Database1.Connected      := Connected;
    Database1.DatabaseName   := DatabaseName;
    Database1.DriverName     := DriverName;
    Database1.Exclusive      := Exclusive;
    //...
  end;
  with Memo1 do
  begin
    Clear;
    Lines.Add('AliasName   : '+ Database1.AliasName);
    Lines.Add('Connected   : '+ BOOLVALUE[Database1.Connected]);
    Lines.Add('DatabaseName: '+ Database1.DatabaseName);
    Lines.Add('DriverName  : '+ Database1.DriverName);
    Lines.Add('Exclusive   : '+ BOOLVALUE[Database1.Exclusive]);
    //...
  end;
end;
end.
También tomá en cuenta implementar la opción que te sugiere cloayza.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
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
Pasar datos de una aplicacion a otra! ideas pleas voldemmor Varios 8 27-01-2009 17:27:28
Pasar mensajes con punteros a otra aplicación escafandra C++ Builder 15 20-02-2008 11:03:06
Se Pueden Pasar Form/units de una aplicacion a otra? Alexis De la Cr Varios 8 06-07-2006 19:05:42
Pasar texto de una aplicacion delphi a otra OmarPerez API de Windows 4 13-07-2005 20:56:19
Como usar el componente TDatabase luisreg Conexión con bases de datos 2 27-11-2003 17:55:57


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


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