在动态连接库中做数据查询,关闭出错,急急急 !(200分)

D

Dbjam

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:
我写了一个dll,在dll中要操作数据库,有一exe文件调用这个dll,exe文件退出时内存出错。
程序如下.
//--------------------------------------------- dll
library trans;
uses
SysUtils,
Classes,
windows,
DbTables;
function InitDB(Driver,Service,Database,UserName,Password:pChar;Check:Boolean):Bool;Stdcall;
var
__db:tdatabase;
begin
result:=false;
__db:= TDatabase.Create(nil);
__db.DatabaseName := 'TransTest';
__db.DriverName := Driver;
__db.params.clear;
__db.Params.Add('server name='+Service);
__db.Params.Add('database name='+Database);
__db.Params.Add('user name='+Username);
__db.Params.Add('password='+password);
__db.LoginPrompt := false;
try
__db.Open;
// / 如果注释掉这两行,主程序退出不会出错
__db.close;
// /
result:=true;
except
end;
__db.free;
end;
end;

exports
InitDB index 2;
{$R *.RES}
begin

end.

//------------------------------------------ exe
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function InitDB(Driver,
Service,
Database,
UserName,
Password:pChar;
Check:Boolean
):Bool;Stdcall;external 'dbtest.dll';
var
Form1: TForm1;
implementation
uses
registry,
DbTables;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
if InitDB('informix','onmcis_online','trans','informix','informix',true) then
showmessage('connect ok');
end;

end.
 
procedure TForm1.Button1Click(Sender: TObject);
var DD1:TDataBase;
begin
DD1:=TDatabase.Create(nil);
DD1.DatabaseName := 'medb';
DD1.params.clear;
DD1.Params.Add('user name=test');
DD1.Params.Add('password=test');
DD1.LoginPrompt := false;
DD1.Open;
DD1.Close;
end;
我在我自己这儿测试能通过,那么请你试一下,你首先在你自己的表单中照着这样测试一下看
会不会出问题.若出问题,请贴出错误代码.不然,别人怎么知道你出的什么错呢?若你在表单
中测试不出问题,再移到DLL中去试.而且将可疑会出错的代码去掉,一行一行的加上去,看到
底是哪一行出了问题.你可以先在DLL中写定连接方式,若能连接正常,你再以参数传进去,那
样你就知道到底是这种方法不行,还是根本你的字串有问题.而这个问题却是非常简单容易解
决的.
 
我用的是Ado,Fconnection是一个property.
rs: _recordset;
begin
try
rs := CoRecordset.Create;
rs.Open('select top 0 * from book', FConnection, 1, 3, adCmdText);

open的时候有sql语句。你不会疏漏了sql语句吧?
 
[:)]谢谢大家支持:
to zhangkan:我已经测试过将dll程序代码放在一个Unit中,测试没有问题。
另如果使用dll程序后,退出exe出现的错误如下“Project D:/db/test/project1.exe
faulted with message:'access violation at 0x4be43541:read of address 0fff96964'.
Process Stopped. Use Step or Run to continue.”
to 千中元:ADO好象没有问题,但别人写的程序全部是用BDE。
而我在Dll中只是测试了打开/关闭数据库连接,还没来得及测试用SQL语句,就不行了
Help!
 
谢谢大家的帮助,虽然没有找到最后的答案,但是我决定结束这个问题.原因是:
1.即使可以在Dll中使用BDE,但无法保留BDE的连接,而每次使用的连接时间又很长,
因而我决定使用.Bpl发布了.
2.如果成功,但发布时需要BDE驱动程序,给Delphi以外的程序使用的意义不是太大,
这样我不如用ADO,更通用一些
3.如果对这个问题大家还有更好的建议,别忘了通知我一声握dbjam@netease.com
 
多人接受答案了。
 
顶部