谁来给个解释?(50分)

  • 主题发起人 主题发起人 zzhdi
  • 开始时间 开始时间
Z

zzhdi

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个Dll,这个dll通过bde连接Sqlsever2000。代码如下:
library wlgl;
uses
SysUtils, Classes, dm in 'dm.pas' {Dmfm: TDataModule};
Exports
ConnectServer;
{$R *.res}
begin
end.

unit dm;
interface
uses
SysUtils, Classes, DB, DBTables;
type
TDmfm = class(TDataModule)
Database1: TDatabase;
private
{ Private declarations }
public
{ Public declarations }
end;

function ConnectServer(ConnecterName:PChar;Password:PChar):Boolean; stdcall;
var
Dmfm: TDmfm=nil;
implementation
uses forms;
{$R *.dfm}
function ConnectServer(ConnecterName:PChar;Password:PChar):Boolean;
begin
if dmfm=nil then Dmfm:=TDmfm.Create(application);
with dmfm.Database1 do
begin
if Connected then Connected:=false;
Params.Clear;
Params.Add('USER NAME='+ConnecterName);
params.Add('Password='+Password);
LoginPrompt:=false;
Connected:=true;
Result:=Connected;
end;
end;
调用这个Dll的程序部分代码如下:
unit mainform;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
Tmainfrm = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
function ConnectServer(ConnecterName:PChar;Password:PChar):Boolean; stdcall;external 'wlgl.dll';
var
mainfrm: Tmainfrm;
implementation
{$R *.dfm}
procedure Tmainfrm.Button1Click(Sender: TObject);
begin
if ConnectServer('sa','sa') then showmessage('ok');
end;
end.
我点击Button1后关闭这个程序时,出错。我用 动态链接dll 的方式无错,但反映迟钝。我把dll中的
connected赋值false也无错。我把数据库改为Delphi6 自带的DBDemos数据库,无错。
 
Dmfm最后要先断开Database1的连接,然后FREE。
 
to Kkyy:
如何让dll自己断开链接呢,能否给个提示
 
谁要源码给我个信。QQ:33771608
 
怎么不用ADO呀,这个比DBE好多了。
 
我觉得还是自己管理创建和释放组件较好,这样看看呢
function ConnectServer(ConnecterName:PChar;Password:PChar):Boolean;
begin
result:=false;
if dmfm=nil then Dmfm:=TDmfm.Create(application);
try
with dmfm.Database1 do
begin
if Connected then Connected:=false;
Params.Clear;
Params.Add('USER NAME='+ConnecterName);
params.Add('Password='+Password);
LoginPrompt:=false;
try
open;
Result:=Connected;
close;
except
end;
end;
finally
dfdm.free;
dfdm:=nil;
end;
end;
 
Nizvoo@etang.com

发过来看看先。。。。

DLL最近钻究中
 
tornado_cs:
我刚刚连到数据库,就断开,我不是做练习题
 
我觉得你的连接函数中只提供了访问者的用户名和密码,但是没有提供sql server本身所在的
机器的名称及需要连接的数据库的名称,所以连接时反应慢是可能的
 
goodyuanpeng@371.net

共同研究。
 
library DataEntry;

uses
SysUtils,
Classes,
ADOdb;
function fbSelectQu( lsMachineName : PChar
; lsUser : PChar
; lsPasswd : PChar
; lsQu : PChar) : Boolean; stdcall;
var
lsSQL : String;
lqSQL : TADOQuery;
begin
lsSQL := ' SELECT * FROM T00 WHERE l = ''' + lsQu + '''';
lqSQL := TADOQuery.Create(nil);
lqSQL.Close;
lqSQL.ConnectionString := 'Provider=SQLOLEDB.1;Password=' + lsPasswd + ';Persist Security Info=True;User ID=' + lsUser + ';Initial Catalog=bellmax;Data Source=' + lsMachineName;
lqSQL.SQL.Clear;
lqSQL.SQL.Add(lsSQL);
try
lqSQL.Open;
except
end;
if lqSQL.IsEmpty then
Result := False
else
Result := True;
lqSQL.Free;
end;exports
fbSelectQu;
begin


end.
用adoquery方便些。所有的变量都用参数传进去。由于后台数据库可能不一样,所以connectionstring可能不一样。
用控件adoquery连一下,拷贝下来就可以。
 
to yzqangel:
首先谢谢你。
我的这个dll要频繁地与数据库通信,虽然Ado查询速度很快,但建立连接比较慢,所以我不
能采取你所说的那么做。我的DataMoudle的宿主是Application,所以Application销毁时
必然也销毁DataModule。问题是只要我不连接数据库就没错误。我跟踪了一下,是缺省session
的问题,我怀疑是不是Delphi的bug。需要说明的是我在调用这个dll的程序关闭前,通知Dll
关闭同数据库的连接,也不会出错。我现在的问题是能不能在dll卸载时,让dll自己断开与
数据库的连接。
 
已经给你发过邮件了。程序已修改好。
我认为你有两个错误。
1,没有释放自己创建的数据模块,没有关闭数据连接。
2,你的数据模块的owner虽然是application,但是你没有传入application这个参数。
在dll中application和在调用程序中的application不是一个变量,你必须保证他们一致
才能顺利访问,否则是一个随机值。
 
接受答案了.
 

Similar threads

I
回复
0
查看
633
import
I
I
回复
0
查看
728
import
I
I
回复
0
查看
541
import
I
I
回复
0
查看
628
import
I
后退
顶部