Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Pasar cadena de conexion a tadoconnections dentro de un hilo de ejecucion (https://www.clubdelphi.com/foros/showthread.php?t=69211)

richy08 02-08-2010 17:31:17

Pasar cadena de conexion a tadoconnections dentro de un hilo de ejecucion
 
buenos dias compañeros estoy un poco liado con esta situacion, estoy tratando de crear componentes ado y componentes zeus dentro de un hilo de windows, todo al parecer funciona hasta que trato de asignarle la cadena de conexion al componente tadoconnetions en el evento connect de tcp server este es el codigo

Código Delphi [-]
//Aqui los creo
procedure TFrm_Interfaces.ServerConnect(AThread: TIdPeerThread);
var
  NewClient: PClient;
  MisComponentes:tmisComponentes;
begin
  GetMem(NewClient, SizeOf(TClient));

  NewClient.DNS         := AThread.Connection.LocalName;
  NewClient.Connected   := Now;
  NewClient.LastAction  := NewClient.Connected;
  NewClient.Thread      :=AThread;
  AThread.Data:=TObject(NewClient);

  CoInitialize(nil);
  MisComponentes := tmisComponentes.Create;
  MisComponentes.Conexion := TADOConnection.Create(self);
  MisComponentes.Query := TADOQUERY.Create(Self);
  MisComponentes.Conexion1 := TZConnection.Create(self);
  MisComponentes.Query1 := TZquery.Create(Self);

  AThread.Data := @MisComponentes;

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

  Protocol.Lines.Add(TimeToStr(Time)+' The connection to '+NewClient.DNS+' was connected');
end;


//aqui intento usarlos y es donde truena
procedure TFrm_Interfaces.ServerExecute(AThread: TIdPeerThread);
var
  ActClient, RecClient: PClient;                                                                              
  CommBlock, NewCommBlock: TCommBlock;
  RecThread: TIdPeerThread;
  i, seleccion: Integer;
  MisComponentes:tmisComponentes;
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

    MisComponentes :=  tmisComponentes(AThread.Data);

    //conneccionMSSQL
    MisComponentes.Conexion.ConnectionString:=cadena; //esta linea es la que causa el problema
    MisComponentes.Conexion.loginprompt:=false;
    MisComponentes.Conexion.provider:='SQLOLEDB.1';
    MisComponentes.Conexion.connected;
    //conneccionMSSQL

    //conneccionMysql

    MisComponentes.Conexion1.Catalog:= 'lookup';
    MisComponentes.Conexion1.Database:= 'cdr';
    MisComponentes.Conexion1.HostName:= '192.168.10.3';
    MisComponentes.Conexion1.Password:= 'siti270';
    MisComponentes.Conexion1.Protocol:= 'mysql-5';
    MisComponentes.Conexion1.port:= 3306;
    MisComponentes.Conexion1.User:= 'root';
    MisComponentes.Conexion1.connect;
    
    //conneccionMysql

    //queryMssql
    MisComponentes.Query.Close;
    MisComponentes.Query.Connection:= MisComponentes.Conexion;
    MisComponentes.Query.SQL.Text:='select idext, DesTel from pbx_ext where acode=:acode';
    MisComponentes.Query.parameters.ParamByName('acode').Value:=CommBlock.acode;
    MisComponentes.Query.cursorType := ctStatic;
    MisComponentes.Query.open;
    //queryMssql

    //queryMysql
     MisComponentes.Query1.Connection:=MisComponentes.Conexion1;
     MisComponentes.Query1.SQL.Text:='update lookup set  allowcalls=:allowcalls, ldesc=:ldesc where code=:code ';
    //queryMysql


    //ejecuta abrir y cerrar lineas
     i:=0;
     seleccion:=MisComponentes.Query.RecordCount;
     MisComponentes.Query.First;
     While ido
     begin
        MisComponentes.Query1.Close;
        MisComponentes.Query1.ParamByName('allowcalls').Value:=CommBlock.estado;
        MisComponentes.Query1.ParamByName('ldesc').Value:=CommBlock.nombre;
        MisComponentes.Query1.ParamByName('code').Value:=MisComponentes.Query1.fieldbyname('idext').Value;
        MisComponentes.Query1.ExecSQL;
        i:=i+1;
        MisComponentes.Query.Next;
     end;
    //ejecuta abrir y cerrar lineas

    Protocol.Lines.Add (TimeToStr(Time)+' The process for '+CommBlock.MyUserName+' was done ');// # Confirm'+inttostr(CommBlock.nconf));
    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;

el error que marca es el siguiente ---------------------------
Debugger Exception Notification
---------------------------
Project interfacesP.exe raised exception class EAccessViolation with message 'Access violation at address 00F2BBA9. Write of address 00000000'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

alguna idea de por que me de el error o alguna otra sugerencia de como podria crear dichos componentes y manipularlos gracias por cualquier comentario

ContraVeneno 02-08-2010 17:43:33

me parece que el problema no es la cadena de conexión, si no mas bien creo que cuando quieres asignar la cadena de conexión, tus componentes no han sido creados todavía y por eso te aparece el error.

verifica que cuando llegues a esa línea, tus componentes ya hayan sido creados.

richy08 02-08-2010 17:59:50

no al llegar ahi el componnete ya fue creado, el problema es en esta linea
AThread.Data := @MisComponentes; segun lo que me explico un compañero del foro lo que hace es meter la direccion de memoria a la variable data del hilo pero en en evento Evecute del tcpserver trato de recuperar dichos valores pero no entiendo por que no lo recupera :(

Código Delphi [-]
procedure TFrm_Interfaces.ServerExecute(AThread: TIdPeerThread);
var
  ActClient, RecClient: PClient;                                                                              
  CommBlock, NewCommBlock: TCommBlock;
  RecThread: TIdPeerThread;
  i, seleccion: Integer;
  MisComponentes:tmisComponentes;
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

    MisComponentes :=  tmisComponentes(AThread.Data);//trato de recuperar las conexiones creadas
    
    //queryMssql
    MisComponentes.Query.Close;
    MisComponentes.Query.parameters.ParamByName('acode').Value:=CommBlock.acode;
    MisComponentes.Query.open;
    //queryMssql

    //ejecuta abrir y cerrar lineas
     i:=0;
     seleccion:=MisComponentes.Query.RecordCount;
     MisComponentes.Query.First;
     While ido
     begin
        MisComponentes.Query1.Close;
        MisComponentes.Query1.ParamByName('allowcalls').Value:=CommBlock.estado;
        MisComponentes.Query1.ParamByName('ldesc').Value:=CommBlock.nombre;
        MisComponentes.Query1.ParamByName('code').Value:=MisComponentes.Query1.fieldbyname('idext').Value;
        MisComponentes.Query1.ExecSQL;
        i:=i+1;
        MisComponentes.Query.Next;
     end;
    //ejecuta abrir y cerrar lineas

    Protocol.Lines.Add (TimeToStr(Time)+' The process for '+CommBlock.MyUserName+' was done ');// # Confirm'+inttostr(CommBlock.nconf));
    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;

cloayza 02-08-2010 23:39:19

Esta linea:
Código Delphi [-]
AThread.Data := @MisComponentes;
Cambia por esto si el @:
Código Delphi [-]
AThread.Data := MisComponentes;

Saludos

richy08 02-08-2010 23:49:32

gracias cloayza por la respuesta, pero lo solucione metiendo todo a un objeto records lo he estado porbando y creo que funciona bien saludos.


La franja horaria es GMT +2. Ahora son las 07:19:40.

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