TAdoConnection和TDataModule设置及创建和初始化的问题?

railgunman 2006-10-27 10:40:53
是这样:在一个TDataModule上放置一个TAdoConnection,然后这个TAdoConnection作为全局的数据连接,然后,涉及数据的窗口都引用这个单元,并且把Connection设置为全局的TAdoConnection,问题来了:
在设计时,经常要打开窗口上的数据集,只要一打开数据集,那么,TDataModule上的TAdoConnection就自动打开了,也直接的被编译到程序里去了,这样的话,程序运行的时候,就首先根据TAdoConnction中的设置,自动的去连接设计时期的数据库,因为设计时连的数据库和发布时的数据库不一样,因此,这个连的过程会花很长时间。要避免这种情况发生该怎么做?不要给我说在编译程序之前把TDataModule上的TAdoConnection关闭哈。
问题2:我在TDataModule的OnCreate和TAdoConnection的OnBeforeConnect中写代码测试,发现TAdoConnection的OnBeforeConnect比TDataModule的OnCreate先发生,这是怎么回事呢?
...全文
287 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
railgunman 2006-11-16
  • 打赏
  • 举报
回复
看来大家都没办法了.
do2008 2006-10-28
  • 打赏
  • 举报
回复
这样运行运行达到了,即使编译之前很可能搞忘设置ADOConnection为false,编译后的程序,运行时也不会主动去连接不对的数据库;

但这样有一个问题,不好地方,因为在代码中,在标志变量fAdoReady未准备好时,是取消了这个连接,

但pending 连接这个操作,会产生一个"操作已被用户取消."的提示对话框;


这个错误对话框,我稍为查看了一下VCL,不是用ADODB.PAS中产生的,
而是由adoint.pas中的 Connection15 = interface(_ADO)的Open函数产生的,
也就是说是ADO组件自身抛出的一个异常提示框;

我还没有办法去掉这个提示框;

这样还不如,在你编译时,检查AdoConnection的connected 为false;
简单方便,,

如果连这个记不起了,那就是YY自己了
do2008 2006-10-28
  • 打赏
  • 举报
回复
重写TDataModule的构造函数Create,编写ADOConnectionWillConnect事件

unit Unit2;

interface

uses
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.


railgunman 2006-10-28
  • 打赏
  • 举报
回复
楼上的大哥,我按你说的方法做了,好像不的行哦。
do2008 2006-10-27
  • 打赏
  • 举报
回复
编译工程之前,把TAdoConnection的connected 设置为false ,保存再编译;
railgunman 2006-10-27
  • 打赏
  • 举报
回复
对,设计时是把数据集打开了,但是我把当前界面上数据集关闭了,没有把全局数据模块中的TAdoConnection关闭。所以造成这种问题。怎么在程序里用代码解决?
就是数据模块创建时,怎么阻止AdoConnetion自动连接数据库?
Dlwxn 2006-10-27
  • 打赏
  • 举报
回复
2,猜测可能是你在开始就把数据集打开了,要看具体的代码才知道。
Dlwxn 2006-10-27
  • 打赏
  • 举报
回复
问题1:通过写配置文件来连接数据库,发布的时候,配置文件内容为空。当读取配置文件内容为空的时候,就不连接数据库,让用户自己设置数据库连接。
do2008 2006-10-27
  • 打赏
  • 举报
回复
>>编译之前很可能搞忘,就因为要搞忘所以我才问这个问题啊

方法:

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;;
董董 2006-10-27
  • 打赏
  • 举报
回复
编译时就让TAdoConnection的Connected := False,通过该TAdoConnection进行数据库连接的所有TDataSet的Active属性,都为False。这样一来,程序开始启动时,肯定不会自动主动去连接数据库的。

程序运行过程中,具体到某个模块(或窗口),需要某个TDataSet被打开时,设置该TDataSet.Active := True,这时候,就会发生一系列的底层自动化操作,其中一个就是TAdoConnection.Connected := True这样一个结果。
railgunman 2006-10-27
  • 打赏
  • 举报
回复
看来是没有人能解决了!
railgunman 2006-10-27
  • 打赏
  • 举报
回复
编译之前很可能搞忘,就因为要搞忘所以我才问这个问题啊

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧