1

我需要在运行时设置/运行 fdconnection 和 fdquery。但是怎么做?

我在我的代码中尝试这个:

var
 LocalConnection: TFDConnection;
 LicencasTable: TFDQuery;
 FDPhysMySQLDriverLink1: TFDPhysMySQLDriverLink;
 FDGUIxWaitCursor1: TFDGUIxWaitCursor;
 oParams: TStrings;
begin

  LocalConnection := TFDConnection.Create(Self);

  FDPhysMySQLDriverLink1 := TFDPhysMySQLDriverLink.Create(Self);
  FDGUIxWaitCursor1      := TFDGUIxWaitCursor.Create(Self);
  FDPhysMySQLDriverLink1.VendorLib := ExtractFilePath(Application.exename)+'libmysql.dll';


  try
   if Variaveis.hostbd <> '' then begin
    oParams := TStringList.Create;
    oParams.Add('Server=' + Variaveis.hostbd);
    oParams.Add('Database='+Variaveis.databasebd);
    oParams.Add('User_Name='+Variaveis.usuariobd);
    oParams.Add('Password='+Variaveis.password);
    oParams.Add('DriverID=MySQL');
    LocalConnection.Params.UserName := Variaveis.usuariobd;
    LocalConnection.Params.Password := Variaveis.password;
    FDManager.AddConnectionDef('bloqueio', 'MySQL', oParams);
    LocalConnection.DriverName := 'MySQL';
    LocalConnection.LoginPrompt := false;
    LocalConnection.Connected := true;
    if LocalConnection.Connected then
        // Busca o registro do sistema no bd
        LicencasTable := TFDQuery.Create(Self);
        LicencasTable.Connection :=  LocalConnection;
        ShowMessage(Pchar(LicencasTable.Connection));
        LicencasTable.Close;
        LicencasTable.SQL.Clear;
        ShowMessage('Before open');
        LicencasTable.Open('select * from licencas');
        ShowMessage('After open');
        LicencasTable.Active := true;
        if LicencasTable.Active  then begin
          ShowMessage('Active');
        end;
        if not LicencasTable.Active  then begin
          ShowMessage('This is not Active');
        end;
   end;
  except
    oParams.Free;
  end;

一切正常,直到到达“ LicencasTable.Open('select * from licencas');

query.open 根本不起作用,也没有给我任何错误。为什么打不开,也不显示错误?

我忘了做什么?

4

2 回答 2

2

您的代码在几个方面不正确。首先,您不必关闭它或清除新创建查询的 SQL。其次,您通常不使用该Open方法来设置 SQL 语句。第三,您正在使用 atry..except来释放资源,这是不正确的;如果没有发生异常,则您有内存泄漏。你应该使用 atry..finally代替。

 try
   if Variaveis.hostbd <> '' then begin
    oParams := TStringList.Create;
    oParams.Add('Server=' + Variaveis.hostbd);
    oParams.Add('Database='+Variaveis.databasebd);
    oParams.Add('User_Name='+Variaveis.usuariobd);
    oParams.Add('Password='+Variaveis.password);
    oParams.Add('DriverID=MySQL');
    LocalConnection.Params.UserName := Variaveis.usuariobd;
    LocalConnection.Params.Password := Variaveis.password;
    FDManager.AddConnectionDef('bloqueio', 'MySQL', oParams);
    LocalConnection.DriverName := 'MySQL';
    LocalConnection.LoginPrompt := false;
    LocalConnection.Connected := true;
    if LocalConnection.Connected then
    begin
        // Busca o registro do sistema no bd
        LicencasTable := TFDQuery.Create(Self);
        LicencasTable.Connection :=  LocalConnection;
        ShowMessage(Pchar(LicencasTable.Connection));
        ShowMessage('Before open');
        LicencasTable.SQL.Text := 'select * from licencas';
        LicencasTable.Active := true;
        if LicencasTable.Active  then begin
          ShowMessage('Active');
        end;
        if not LicencasTable.Active  then begin
          ShowMessage('This is not Active');
        end;
    end;
  finally
    oParams.Free;
  end;
于 2020-09-19T23:55:02.933 回答
1

我使用这段代码:

procedure ConnectLiveTest( fdc: String );    
  var i: Integer;    
begin    
dm.fdc.Connected:= False;     
  for i :=  0 to dm.ComponentCount -1 do    
      if dm.Components[ i ] is TFDQuery then        
        begin     
        if fdc = 'Live' then        
            begin      
              with dm.fdc.Params as TFDPhysMSSQLConnectionDefParams do    
                begin    
                  Server  := 'server ip address';    
                  Database:= 'dbname';    
                  UserName:= 'username';    
                  Password:= 'password';    
                end;    
            end    
            else    
            begin    
                with dm.fdc.Params as TFDPhysMSSQLConnectionDefParams do    
                  begin    
                    Server  := 'alt ip address';    
                    Database:= 'Testdbname';    
                    UserName:= 'username';    
                    Password:= 'password';    
                  end;    
            end;    
        
          dm.fdc.Connected:= True;    
          TFDQuery( dm.Components[ i ]).Active:= True;    
        end;    
    end;  



 

所以我只使用一个 Firedac 连接('fdc'),当我激活主表单时,我将“Live”或“Test”传递给连接到所需服务器的上述过程。

于 2020-09-26T08:22:16.047 回答