Delphi中用于在编译时将数据库连接设置为断开连接的方法

时间:2013-04-30 05:31:09

标签: delphi database-connection delphi-7 vcl

是否存在方法或编译器指令或某种确保某些组件的方法,例如查询或数据库连接在运行构建/编译时设置为active = false或断开连接?似乎经常会被其他东西打开,而且你不会注意到它为时已晚。

我的特别安装是Delphi 7

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

我认为最好的选择是子类库存连接组件,并在你自己的一个覆盖.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组件类相同的名称,然后将自己的方法作为最后一个放在表单中interface-uses list:因此在设计时你会有库存组件,编译时它会被你自己的组件透明地替换。

或者你可以在它的形式声明上面对它进行子类化(如(对于另一个组件):

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

   TForm1 = class(TForm) ....

我想这种方法可能被视为面向方面编程的模拟,在开发人员受益的方式中使用IDE的限制。


另一种方法可能是某些脚本,它可以在保存时或构建之前清除DFM中的.Active属性,但这种方式很复杂

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

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

您可以将相同的代码复制粘贴到每个Form的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单元与所有与您可能使用的与数据库相关的库和组件紧密耦合。对于大型继承项目,由不同的二进制模块组成,历史上基于不同的数据库访问库和迁移过程,从而将所有访问库拉入每个二进制模块。
    1. 它可以通过ad hoc DI框架来克服,但是相反的情况可能会发生:你冒险欠交付,你可能只是忘记将一些库或组件处理程序注入到实际使用它或被修改为使用它的项目中
  • 如果您的表单有一些组件,其连接不应重置(对象数组作为数据集,内存表,内存中的NexusDB或SQLite数据库等),您必须提出ad hoc非 - 明显的选择将他们退出。

答案 2 :(得分:1)

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