动态链接库中使用TQuery总是出现登录对话框,如何取消?急救!!!!!!(200分)

  • 主题发起人 主题发起人 猫眼
  • 开始时间 开始时间

猫眼

Unregistered / Unconfirmed
GUEST, unregistred user!
我的系统配置大致如下:
Windows 2000 pro (or server) sp3,Sybase 12.0,Delphi 5 update pack 1,BDE。
在一个动态连接库中有两个单元(当然还有别的单元,这里不列出来了):
*******************
unit Unit1

interface

uses
……, utPub;

type
TForm1 = class(TForm)
……
Query1: TQuery;
procedure FormCreate(Sender: TObject);
private
……
public
……
end;

var
Form1: TForm1;

implementation

……
procedure TForm1.FormCreate(Sender: TObject);
begin
Query1.DatabaseName := DataBase.DataBaseName;
end;
……

end.
*********************
unit utPub;

interface

uses
DBTables;

procedure SetConnection(ADataBase: TDataBase); stdcall;

var
DataBase: TDataBase;

implementation

procedure SetConnection(ADataBase: TDataBase);
begin
if not Assigned(DataBase) then
DataBase := ADataBase;
end;

end.
**********************
动态链接库中导出SetConnection这个过程。
从外部调用时,传递一个TDataBase组件进去,该组件的LoginPrompt为False,Params中已经
设置用户名和密码,而且可以正常连接上。
但是在运行时,当该模块中的Query1第一次企图Open时,总是会出现登录对话框(如果只是简
单的exe,不会出现这样的问题),以后Close再Open就没事了。而且只要有任意一个Query已经
Open过了,其它的Query都不会有事了。该问题已经困扰我好几天了,急盼高手相助。究竟如何
才能让TQuery使用TDataBase的连接呢?
 
设置connection的loginprompt属性
 
奇怪,既然已经False了,不应该有问题啊。你是程序动态赋值的吗?
SetConnection(ADataBase: TDataBase); 我怀疑这里没有指定。
 
你的调用函数的database应设置为全局变量,这样在dll中才能访问到.
 
这位兄台,我的建议如下:
   1、检查你的connection组件的连接字串的有效性
   2、你很有可能是先调用QUERY后来再才传递参数PARAM


   
 
可以在 query1 的 beforeOpen 事件中加上 showmessage(query1.connection.connectionstring)
以测试 query1 在 open 前是否已设好 connection .
 
我感觉你在你的dll里加上DataBase控件,设置一下,估计就没了,我以前也遇到过。
 
我在Dll中,把TQuery和TDataBase控件放在同一窗口中,传入的DataBase赋值给它,还是不行的。
 
re:mk1024
BeforeOpen事件中,Query的DataBaseName属性已经正确设置了,而且在这个事件中,对话框尚未出现。
设置的LoginPrompt属性以及参数都正确.BeforeOpen中的代码执行完后,对话框出现,输入用户名密码,然后就Open了
DataBase连接时不出现对话框,说明设置的LoginPrompt属性以及参数都正确,但这个连接就是不能被Query使用
如果是普通的exe,放在一起的话是绝对没问题的。但现在是dll,就这样了[:(][:(][:(]

 
这个问题很好解决:
传入Database.Handle就可以解决了!
例子(共享同一连接,需引用BDE单元):
procedure SetConnection(ADBHandle: hdbidb);
begin
Database := TDaTaBase.Create(nil);//虽然创建,但仍使用同一连接!
DataBase.DatabaseName := 'XXX';
DataBAse.Handle := ADbHandle;
end;
//当然传入时的Database应打开,否则的话会有问题;
 
这个问题好像以前也有回答过!
另外传TDatabase还会有些其它指针错误问题。
 
Query1.DatabaseName := DataBase.DataBaseName
这句好象有问题,我记得好象应该是别名才对,
你试试我这里记不得怎么拼写了,BDE连接DATABASE有两个数据库名字的属性,
这里没有DELPHI
 
呵呵。问题搞定了。非常感谢冷大侠!
 
后退
顶部