【问题标题】:Method in Delphi to set database connections to disconnected upon compileDelphi中的方法在编译时将数据库连接设置为断开连接
【发布时间】:2013-04-30 05:31:09
【问题描述】:

在运行构建/编译时,是否有方法或编译器指令或某种方式确保某些组件(例如查询或数据库连接)设置为 active=false 或断开连接?这些似乎经常被其他东西打开,直到为时已晚才注意到。

我的特定安装是 Delphi 7

【问题讨论】:

    标签: delphi database-connection delphi-7 vcl


    【解决方案1】:

    GExperts 的Set Component Properties 功能可以做到这一点。

    【讨论】:

      【解决方案2】:

      我认为最好的选择是将股票连接组件子类化并在您自己的一个覆盖 .Loaded 这样的方法中

      if not csDesigning in Self.ComponentState then
         if not Self.ActiveInDFM {new boolean published property} then
            if Self.Active then Self.Active := false;
      inherited;
      

      通过 (ab) 使用 Delphi Form Designer 愚蠢,即使没有将新组件实际安装到 IDE Palette 中,您也可以使用它 - 只需将其命名为与 stock 组件类相同的名称,然后将您自己的方法作为最后一个放在表单的接口使用列表:因此在设计时您将拥有库存组件,并且在编译时将透明地替换为您自己的组件。

      或者您可以在表单声明的正上方对其进行子类化,例如(对于另一个组件):

      type
         TPanel = class(ExtCtrls.TPanel)
         private
           ...
      
         TForm1 = class(TForm) ....
      

      我想这种方法可能被视为类似于面向方面的编程,以开发人员受益的方式使用 IDE 的限制。


      另一种方法可能是一些脚本,它在保存或构建之前清除 DFM 中的 .Active 属性,但这种方法对于

      • 我可能更难与独立的构建服务器集成(尝试的每个不同 CI 框架的新脚本)
      • 它也会在设计时重置Active 属性。从严谨的角度来看,这是一件正确的事情。但这可能不是很方便。

      您可以在 Form 和 DataModule 的 .Loaded method 中使用类似的代码(然后您必须覆盖它而不是连接的方法)。

      您可以将相同的代码复制粘贴到每个表单的 Loaded 方法中。

      procedure TMyForm.Loaded; // override
      var c: TComponent; i: integer;
      begin
        try 
          for i := 0 to Self.ComponentsCount - 1 do begin
              c := Self.Components[i];
              if c is TCustomConnection then
                 with TCustomConnection(c) do // Hate those redundant typecasts!
                   if Connected then Connected := false;
              if c is TDataSet then
                 with TDataSet(c) do // Delphi could took a lesson from Component Pascal
                    if Active then Active := false;
              if c is ... // transactions, stored procedures, custom libriaries...
          end;
        finally
          inherited;
        end;
      end;    
      

      这似乎不那么狡猾 - 因此最可靠。然而,如果复制粘贴,那就很多了,如果您稍后添加一些新组件或库,可能会要求修改所有表单中的复制粘贴代码。

      您可以将此代码集中在某个 MyDBUtils 单元中的全局过程中,例如 Disconnect(const owner: TComponent);,然后

      procedure TMyForm.Loaded; // override
      var c: TComponent; i: integer;
      begin
        try 
          MyDBUtils.Disconnect(Self);
        finally
          inherited;
        end;
      end;
      

      这种方法也有缺点:

      • 这将使MyDBUtils 单元与所有您可能使用的与数据库相关的库和组件紧密耦合。对于大型继承项目,由不同的二进制模块组成,历史上基于不同的 db-access 库并在迁移过程中,从而将所有访问库拉入每个二进制模块中。
        1. 它可以通过 ad hoc DI 框架来克服,但相反的情况可能会发生:您可能会面临交付不足的风险,您可能只是忘记将一些库或组件处理程序注入到实际使用它的项目中,或者被修改以使用它.
      • 如果你的表单有一些组件,它们的连接不应该被重置(对象数组作为数据集、内存表、内存 NexusDB 或 SQLite 数据库等),你必须想出 ad hoc non - 选择退出的明显惯例。

      【讨论】:

        【解决方案3】:

        在我的应用程序中,我在设计时将连接的Tag 属性设置为1。在OnBeforeConnect事件中,我检查Tag,如果它等于1,我就中止连接并将其设置为0。

        【讨论】:

        • 带标签的技巧很好用。澄清一下:连接可以中止,即通过清除 DatabaseName。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-15
        • 2014-07-18
        • 1970-01-01
        • 1970-01-01
        • 2021-03-15
        • 2017-02-12
        • 2010-12-03
        相关资源
        最近更新 更多