是这样:在一个TDataModule上放置一个TAdoConnection,然后这个TAdoConnection作为全局的数据连接,然后,涉及数据的窗口都引用这个单元,并且把Connection设置为全局的TAdoConnection,问题来了:
    在设计时,经常要打开窗口上的数据集,只要一打开数据集,那么,TDataModule上的TAdoConnection就自动打开了,也直接的被编译到程序里去了,这样的话,程序运行的时候,就首先根据TAdoConnction中的设置,自动的去连接设计时期的数据库,因为设计时连的数据库和发布时的数据库不一样,因此,这个连的过程会花很长时间。要避免这种情况发生该怎么做?不要给我说在编译程序之前把TDataModule上的TAdoConnection关闭哈。
   问题2:我在TDataModule的OnCreate和TAdoConnection的OnBeforeConnect中写代码测试,发现TAdoConnection的OnBeforeConnect比TDataModule的OnCreate先发生,这是怎么回事呢?

解决方案 »

  1.   

    对,设计时是把数据集打开了,但是我把当前界面上数据集关闭了,没有把全局数据模块中的TAdoConnection关闭。所以造成这种问题。怎么在程序里用代码解决?
    就是数据模块创建时,怎么阻止AdoConnetion自动连接数据库?
      

  2.   

    编译工程之前,把TAdoConnection的connected 设置为false ,保存再编译;
      

  3.   

    编译时就让TAdoConnection的Connected := False,通过该TAdoConnection进行数据库连接的所有TDataSet的Active属性,都为False。这样一来,程序开始启动时,肯定不会自动主动去连接数据库的。程序运行过程中,具体到某个模块(或窗口),需要某个TDataSet被打开时,设置该TDataSet.Active := True,这时候,就会发生一系列的底层自动化操作,其中一个就是TAdoConnection.Connected := True这样一个结果。
      

  4.   

    >>编译之前很可能搞忘,就因为要搞忘所以我才问这个问题啊方法:1.设置TDataModule的属性OldCreateOrder 为true;然后就在TDataModule的OnCreate事件中写
    TAdoConnection.connected :=false;帮助中这样写到:
    When OldCreateOrder is false (the default) the OnCreate event occurs after all constructors are finished (from the AfterConstruction method) and the OnDestroy event occurs before any destructors are called (from the BeforeDestruction method).When OldCreateOrder is true, OnCreate is triggered from the data module constructor and OnDestroy from the data module destructor.
    2.如果设置OldCreateOrder 为false,
    重载这个函数,procedure AfterConstruction; override;
    这个函数中试试TAdoConnection.connected :=false;;
      

  5.   

    重写TDataModule的构造函数Create,编写ADOConnectionWillConnect事件unit Unit2;interfaceuses
      SysUtils, Classes, DB, ADODB,Dialogs;type
      TDataModule2 = class(TDataModule)
        ADOConnection: TADOConnection;
        tbl1: TADOTable;
        procedure ADOConnectionBeforeConnect(Sender: TObject);
        procedure DataModuleCreate(Sender: TObject);
        procedure ADOConnectionWillConnect(Connection: TADOConnection;
          var ConnectionString, UserID, Password: WideString;
          var ConnectOptions: TConnectOption; var EventStatus: TEventStatus);
      private
        { Private declarations }
        fAdoReady:Boolean;
      public
        { Public declarations }
        constructor Create(AOwner: TComponent); override;
      end;var
      DataModule2: TDataModule2;implementation{$R *.dfm}constructor TDataModule2.Create(AOwner: TComponent);
    begin
      fAdoReady := false;
      showmessage('TDataModule2.Create1');
      inherited;
      fAdoReady := true;
      showmessage('TDataModule2.Create2');
    end;procedure TDataModule2.ADOConnectionBeforeConnect(Sender: TObject);
    begin
       showmessage('TDataModule2.ADOConnectionBeforeConnect');
    end;procedure TDataModule2.DataModuleCreate(Sender: TObject);
    begin
      showmessage('TDataModule2.DataModuleCreate');end;procedure TDataModule2.ADOConnectionWillConnect(Connection: TADOConnection;
      var ConnectionString, UserID, Password: WideString;
      var ConnectOptions: TConnectOption; var EventStatus: TEventStatus);
    begin
      if (  fAdoReady = false) then//标志为false时,
      begin
        EventStatus := esCancel;//pending这个连接操作
      end;end;end.
      

  6.   

    这样运行运行达到了,即使编译之前很可能搞忘设置ADOConnection为false,编译后的程序,运行时也不会主动去连接不对的数据库;但这样有一个问题,不好地方,因为在代码中,在标志变量fAdoReady未准备好时,是取消了这个连接,但pending 连接这个操作,会产生一个"操作已被用户取消."的提示对话框;
    这个错误对话框,我稍为查看了一下VCL,不是用ADODB.PAS中产生的,
    而是由adoint.pas中的  Connection15 = interface(_ADO)的Open函数产生的,
    也就是说是ADO组件自身抛出的一个异常提示框;我还没有办法去掉这个提示框;这样还不如,在你编译时,检查AdoConnection的connected 为false;
    简单方便,,如果连这个记不起了,那就是YY自己了