【问题标题】:Setup a Firedac fdquery and fdconnection in runtime在运行时设置 Firedac fdquery 和 fdconnection
【发布时间】:2023-03-07 12:34:01
【问题描述】:

我需要在运行时设置/运行 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 根本不起作用,也没有给我任何错误。为什么打不开,不显示错误?

我忘了做什么?

【问题讨论】:

    标签: delphi firedac


    【解决方案1】:

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

    【讨论】:

    • 根据您的代码,我给出:-340。未定义驱动程序 ID。设置 TFDConnection.DriverName... 但 DriverID 和 DriverName 设置正确
    • 我的建议是让您启动一个新的 FMX 应用程序,在表单上放置一个 TFDConnection,按照您想要的方式进行设置,通过激活连接对其进行测试以确保其正常工作。然后查看 .FMX 文件的内容,看看它是如何在那里配置的。然后,您就有了可在代码中使用的正确信息。我不能为你做这件事,因为我没有安装 MySQL 或你的数据库要连接。
    • 谢谢肯,我会试试的。我正在尝试做的代码是在一个组件中,而不是可视的。每当启动插入此组件的应用程序时,它只需要通过 fireac 设置与 dbmysql 的连接并在表中插入,所有这些都在运行时进行。有什么建议吗?
    • 是的,完全按照我的建议去做。您将获得配置连接所需的正确信息,然后您可以使用这些信息来确定代码中需要设置的内容。将 TFDConnection 放到一个新的空应用程序的主窗体上,将其设置为正确连接到您的数据库,然后读取 .fmx 文件以查看连接参数是如何设置的。您也可以只要求组件的用户建立自己的连接,然后将该连接分配给您的组件,就像 TDataSource 要求您建立数据集并分配它一样。
    【解决方案2】:

    我使用这个代码:

    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”传递给连接到所需服务器的上述过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      相关资源
      最近更新 更多