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 12-07-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
No se.
Recuerda que vas a necesitar UN SOLO ZConnection para todo.
Con solo que lo crees una vez bastara.
Los query o tables los tienes que conectar al componente Zconnection que creaste, de lo contrario no encontrara la BD.
En esto nunca he hecho nada no puedo guiarte muy bien que digamos, asi que no te fíes mucho.
Saludos
__________________
Siempre Novato
Responder Con Cita
  #2  
Antiguo 12-07-2010
Avatar de richy08
richy08 richy08 is offline
Miembro
 
Registrado: may 2007
Ubicación: Bucerias, Nayarit Mexico
Posts: 529
Poder: 17
richy08 Va por buen camino
gracias caral por tu ayuda me has alumbrado un poco mas el camino seguire testeandolo para asegurarme.
Responder Con Cita
  #3  
Antiguo 13-07-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Caral Ver Mensaje
Recuerda que vas a necesitar UN SOLO ZConnection para todo.
Con solo que lo crees una vez bastara.
Eso suele ser lo normal, pero en el caso de Ricky08 (por lo que ha comentado en otros mensajes) es que está trabajando con threads, y lo normal en Threads es que haya que crear una conexión independiente en cada thread, supongo que por eso el "crear componentes por código" y "crear diferentes conexiones".

En este caso creo que sí está justificado utilizar diferentes zConnections.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 13-07-2010
Avatar de richy08
richy08 richy08 is offline
Miembro
 
Registrado: may 2007
Ubicación: Bucerias, Nayarit Mexico
Posts: 529
Poder: 17
richy08 Va por buen camino
asi es neftali es por ello el de crearlos dinamicamente aunque no encuentro informacion de como hacerlo por mas que busco no encuentro una lectura o un ejemplo de como crearlas conexiones y los querys en tiempo de ejecucion el dia es largo asi es que manos al teclado espero hoy terminarlo o encontrar una nueva opcion de como hacerlo saludos.
Responder Con Cita
  #5  
Antiguo 13-07-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Se crean como cualquier otro componente en ejecución. Busca sobre creación de componentes en ejecución en los foros y encontrarás bastantes temas con ejemplos de código.

Hay una forma sencilla de saber cómo rellenar las propiedades. Crea un componente en un formulario y rellena las propiedades (por ejemplo un Zconnection) de forma que funcione correctamente. Graba el formulario y revisa las propiedades que se han guardado en el DFM.

Por ejemplo, si creas un ADOQuery en diseño, en el DFM hay esto:

Código:
  object ADOQuery1: TADOQuery
    ConnectionString =
      'FILE NAME=C:\TEST.udl'
    CursorType = ctStatic
    Parameters = <>
    SQL.Strings = (
      'select * from TDeposito where OID=184367')
    Left = 32
    Top = 16
  end
Para crearlo por código utilizarías este:

Código Delphi [-]
    ADOQuery2 := TADOQuery.Create(nil);
    ADOQuery2.ConnectionString :=
      'FILE NAME=C:\TEST.udl';
    ADOQuery2.CursorType := ctStatic;
    ADOQuery2.SQL.Text := 'select * from TDeposito where OID=184367';
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 13-07-2010
Avatar de richy08
richy08 richy08 is offline
Miembro
 
Registrado: may 2007
Ubicación: Bucerias, Nayarit Mexico
Posts: 529
Poder: 17
richy08 Va por buen camino
gracias neftali por el ejemplo lo de crear componentes ya lo solucione con la ayuda de caral, es solo que no entiendo en el siguiente codigo segun yo le doy un nombre al query pero al querer referenciarlo por el nombre no compila, ademas que hice pruebas con querys fijos pero truenan al traslaparse peticiones hacia el server alguna idea de como puedo refeenciar los querys creados por su nombre y otra duda necesito crear variables para controlar un ciclo while y estoy en la misma situacion saludos

Código Delphi [-]
function TFrm_Interfaces.CreaAdo(Myusername, nombre, idext: string; acode : integer):boolean;
begin
       //crea el query   mssql   busca extensiones
       Query      :=   TAdoquery.Create(nil);
       with Query  do
       begin
         Name :=   Myusername+'1';
         Connection:= md_gral.Con_Gral;
         SQL.text:='select idext, DesTel from pbx_ext where acode=:acode ';
         parameters.ParamByName('acode').Value:=1;
       end;


       //crea el query   mysql
       zQuery      :=   TzQuery.Create(nil);
       with zQuery  do
       begin
         Name :=   Myusername+'2';
         Connection:= md_gral.Con_PBXLin;
         SQL.text:='update lookup set  allowcalls=:allowcalls, ldesc=:ldesc where code=:code ';
         {ParamByName('allowcalls').Value:=1;
         ParamByName('ldesc').Value:=nombre;
         ParamByName('code').Value:=idext;}
         Parent:= Frm_Interfaces;
       end;
end;
Responder Con Cita
  #7  
Antiguo 13-07-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por richy08 Ver Mensaje
...es solo que no entiendo en el siguiente codigo segun yo le doy un nombre al query pero al querer referenciarlo por el nombre no compila
¿Cómo haces la referencia? ¿Qué codigo estás utilizando?

Que estés creando el Query en ejecución no quiere decir que no esté como propiedad del Thread (por ejemplo), para que pueda consultarse desde fuera. El problema es que no se cual es la estructura completa de tu programa.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 13-07-2010
Avatar de richy08
richy08 richy08 is offline
Miembro
 
Registrado: may 2007
Ubicación: Bucerias, Nayarit Mexico
Posts: 529
Poder: 17
richy08 Va por buen camino
a ok gracias este es el codigo del ejecutable que se encuentra en el server y mas abajo pongo el del cliente, esta linea es donde tengo el error Connection:= Myusername+'z'; //aqui marca el error no se como asignarle la conexion

//server
Código Delphi [-]
unit Interfaces;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdThreadMgr, IdThreadMgrDefault, IdBaseComponent,
  IdComponent, IdTCPServer, DB, ADODB, strutils, dateutils, ZConnection,
  ZAbstractRODataset, ZAbstractDataset, ZDataset;

type
  PClient   = ^TClient;
  TClient   = record  // Object holding data of client (see events)
  DNS         : String[20];            { Hostname }
  Connected,                           { Time of connect }
  LastAction  : TDateTime;             { Time of last transaction }
  Thread      : Pointer;               { Pointer to thread }
  end;
  
  TFrm_Interfaces = class(TForm)
    CBServerActive: TCheckBox;
    Server: TIdTCPServer;
    IdThreadMgrDefault1: TIdThreadMgrDefault;
    Protocol: TMemo;
    procedure CBServerActiveClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure ServerConnect(AThread: TIdPeerThread);
    procedure ServerDisconnect(AThread: TIdPeerThread);
    procedure ServerExecute(AThread: TIdPeerThread);
  private
    { Private declarations }
    function CreaAdo(Myusername, nombre, idext: string; acode: integer):boolean;
  public
    { Public declarations }

  end;

var
  Frm_Interfaces: TFrm_Interfaces;
  Clients         : TThreadList;     // Holds the data of all clients
  Query     : TAdoquery;
  zQuery    : TzQuery;
  zConnect1 : Tzconnection;
  i, seleccion :integer;
  
implementation

uses GlobalUnit, Prg_MDgral;

{$R *.dfm}

function TFrm_Interfaces.CreaAdo(Myusername, nombre, idext: string; acode : integer):boolean;
begin
       zConnect1:= TzConnection.Create(self);
       With zConnect1 do
       begin
        Parent:= Frm_Interfaces;
        Name:= Myusername+'z';
        Catalog:= 'lookup';
        Database:= 'cdr';
        HostName:= '192.168.11.2';
        Password:= 'system';
        Protocol:= 'mysql-5';
        port:= 3306;
        User:= 'sitisystem';
        Connect
       end;
               
       //crea el query   mssql   busca extensiones
       Query      :=   TAdoquery.Create(self);
       with Query  do
       begin
         Name :=   Myusername+'1';
         Connection:= md_gral.Con_Gral;
         SQL.text:='select idext, DesTel from pbx_ext where acode=:acode ';
         //parameters.ParamByName('acode').Value:=1;
         Parent:= Frm_Interfaces;
       end;

       //crea el query   mysql
       zQuery      :=   TzQuery.Create(self);
       with zQuery  do
       begin
         Name :=   Myusername+'2';
         Connection:= Myusername+'z';  //aqui marca el error no se como asignarle la conexion
         SQL.text:='update lookup set  allowcalls=:allowcalls, ldesc=:ldesc where code=:code ';
         {ParamByName('allowcalls').Value:=1;
         ParamByName('ldesc').Value:=nombre;
         ParamByName('code').Value:=idext;}
         Parent:= Frm_Interfaces;
       end;
end;

procedure TFrm_Interfaces.CBServerActiveClick(Sender: TObject);
begin
  Server.Active := CBServerActive.Checked;
end;



procedure TFrm_Interfaces.ServerConnect(AThread: TIdPeerThread);
var
  NewClient: PClient;
begin
GetMem(NewClient, SizeOf(TClient));

  NewClient.DNS         := AThread.Connection.LocalName;
  NewClient.Connected   := Now;
  NewClient.LastAction  := NewClient.Connected;
  NewClient.Thread      :=AThread;

  AThread.Data:=TObject(NewClient);

  try
    Clients.LockList.Add(NewClient);
  finally
    Clients.UnlockList;
  end;

  Protocol.Lines.Add(TimeToStr(Time)+' Connection from "'+NewClient.DNS+'"');
end;



procedure TFrm_Interfaces.ServerExecute(AThread: TIdPeerThread);
var
  ActClient, RecClient: PClient;                                                                              
  CommBlock, NewCommBlock: TCommBlock;
  RecThread: TIdPeerThread;
  i: Integer;
begin
  if not AThread.Terminated and AThread.Connection.Connected then
  begin
    AThread.Connection.ReadBuffer (CommBlock, SizeOf (CommBlock));
    ActClient := PClient(AThread.Data);
    ActClient.LastAction := Now;  // update the time of last action

    CreaAdo(CommBlock.MyUserName, CommBlock.nombre, CommBlock.idext, CommBlock.acode);

    Protocol.Lines.Add (TimeToStr(Time)+' !! "'+CommBlock.MyUserName);
    NewCommBlock.Command := 'DIALOG';       // the message should popup on the client's screen
    NewCommBlock.MyUserName := '[PBX Server]';  // the server's username
    NewCommBlock.Msg := 'The process was done  ';  // the message to show
    NewCommBlock.ReceiverName := '[return-to-sender]'; // unnecessary

    AThread.Connection.WriteBuffer (NewCommBlock, SizeOf (NewCommBlock), true);  // and there it goes...
  end;
end;

procedure TFrm_Interfaces.ServerDisconnect(AThread: TIdPeerThread);
var
 ActClient: PClient;
begin
  ActClient := PClient(AThread.Data);
  Protocol.Lines.Add (TimeToStr(Time)+' Disconnect from "'+ActClient^.DNS+'"');
  try
    Clients.LockList.Remove(ActClient);
  finally
    Clients.UnlockList;
  end;
  FreeMem(ActClient);
  AThread.Data := nil;
end;


procedure TFrm_Interfaces.FormCreate(Sender: TObject);
begin
  Clients := TThreadList.Create;
end;

procedure TFrm_Interfaces.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Server.Active := False;
  Clients.Free;
end;

end.


y este es el fragmento del boton de una de las pantallas que lo mandara llamar.

//client
Código Delphi [-]
.
.
.
TClientHandleThread = class(TThread)
   private
     CB: TCommBlock;
     procedure HandleInput;
   protected
     procedure Execute; override;

  end;


var
  Frm_PosGue: TFrm_PosGue;
  ClientHandleThread: TClientHandleThread;   // variable (type see above)

.
.
.
.

procedure TClientHandleThread.HandleInput;
begin
  if CB.Command = 'MESSAGE' then
     Frm_Posgue.IncomingMessages.Lines.Add (CB.MyUserName + ': ' + CB.Msg)
  else
  if CB.Command = 'DIALOG' then
    MessageDlg ('"'+CB.MyUserName+'" sends you this message:'+#13+CB.Msg, mtInformation, [mbOk], 0)
  else  // unknown command
    MessageDlg('Unknown command "'+CB.Command+'" containing this message:'+#13+CB.Msg, mtError, [mbOk], 0);
end;

procedure TClientHandleThread.Execute;
begin
  while not Terminated do
  begin
    if not Frm_Posgue.Client.Connected then
      Terminate
    else
    try
      Frm_Posgue.Client.ReadBuffer(CB, SizeOf (CB));
      Synchronize(HandleInput);
    except
    end;
  end;
end;
.
.
.

procedure TFrm_PosGue.Btb_InhClick(Sender: TObject);
var
i, seleccion :integer;
CommBlock : TCommBlock;
begin
 CBClientActive.Checked:=true;
      if CBClientActive.Checked then
      begin
        try
           Client.Connect(10000);  // in Indy < 8.1 leave the parameter away
           ClientHandleThread := TClientHandleThread.Create(True); //crea el hilo
           ClientHandleThread.FreeOnTerminate:=True; //para que no se ejecute inmediatamente
           ClientHandleThread.Resume; //lo manda ejecutar
        except
            on E: Exception do MessageDlg ('Error while connecting:'+#13+E.Message, mtError, [mbOk], 0);
        end;
      end
      else
      begin
       ClientHandleThread.Terminate;
       Client.Disconnect;
      end;

    CommBlock.Command      := '';//EditCommand.Text;         // assign the data
    CommBlock.MyUserName   := Client.LocalName;
    CommBlock.Msg          := 'hola';//EditMessage.Text;
    CommBlock.ReceiverName := 'Desarrollo-lap';//EditRecipient.Text;
    CommBlock.nconf        := Qry_principal.fieldbyname('nconf').Value;

    Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
end;
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
como crear dll en tiempo de ejecucion Maycoll Varios 12 10-05-2008 01:57:19
Crear componentes en tiempo de ejecución Mauro® Varios 6 23-08-2007 19:45:29
Crear Componentes en tiempo de ejecucion fartycl Varios 3 21-06-2006 22:03:13
Crear y Borrar componentes en tiempo de ejecución jzginez OOP 6 25-11-2005 16:04:55
Problemas al tratar de crear varios componentes en tiempo de ejecucion ilichhernandez Conexión con bases de datos 2 13-11-2005 19:03:26


La franja horaria es GMT +2. Ahora son las 07:15: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