是这样:在一个TDataModule上放置一个TAdoConnection,然后这个TAdoConnection作为全局的数据连接,然后,涉及数据的窗口都引用这个单元,并且把Connection设置为全局的TAdoConnection,问题来了:
在设计时,经常要打开窗口上的数据集,只要一打开数据集,那么,TDataModule上的TAdoConnection就自动打开了,也直接的被编译到程序里去了,这样的话,程序运行的时候,就首先根据TAdoConnction中的设置,自动的去连接设计时期的数据库,因为设计时连的数据库和发布时的数据库不一样,因此,这个连的过程会花很长时间。要避免这种情况发生该怎么做?不要给我说在编译程序之前把TDataModule上的TAdoConnection关闭哈。
问题2:我在TDataModule的OnCreate和TAdoConnection的OnBeforeConnect中写代码测试,发现TAdoConnection的OnBeforeConnect比TDataModule的OnCreate先发生,这是怎么回事呢?
在设计时,经常要打开窗口上的数据集,只要一打开数据集,那么,TDataModule上的TAdoConnection就自动打开了,也直接的被编译到程序里去了,这样的话,程序运行的时候,就首先根据TAdoConnction中的设置,自动的去连接设计时期的数据库,因为设计时连的数据库和发布时的数据库不一样,因此,这个连的过程会花很长时间。要避免这种情况发生该怎么做?不要给我说在编译程序之前把TDataModule上的TAdoConnection关闭哈。
问题2:我在TDataModule的OnCreate和TAdoConnection的OnBeforeConnect中写代码测试,发现TAdoConnection的OnBeforeConnect比TDataModule的OnCreate先发生,这是怎么回事呢?
就是数据模块创建时,怎么阻止AdoConnetion自动连接数据库?
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;;
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.
这个错误对话框,我稍为查看了一下VCL,不是用ADODB.PAS中产生的,
而是由adoint.pas中的 Connection15 = interface(_ADO)的Open函数产生的,
也就是说是ADO组件自身抛出的一个异常提示框;我还没有办法去掉这个提示框;这样还不如,在你编译时,检查AdoConnection的connected 为false;
简单方便,,如果连这个记不起了,那就是YY自己了