我的dll中有下面的代码
Function AddLog(datatemp:Tdatabase;Model:Tquery;userCode, opt: string;optDate,ExitDate:TDateTime):Boolean;
begin
with Model do
begin
Model.Close;
Model.SQL.Clear;
Model.SQL.Add('insert into f_code_log (userCode,opt,optDate,ExitDate) values( ');
Model.SQL.Add(' :userCode,');
Model.SQL.Add(' :opt,');
Model.SQL.Add(' :optDate,');
Model.SQL.Add(' :ExitDate)');
Model.ParamByName('userCode').Value:=userCode;
Model.ParamByName('opt').Value:=opt;
Model.ParamByName('optDate').Value:=optDate;
Model.ParamByName('ExitDate').Value:=ExitDate;
Model.ExecSQL;
end;
Result:=True;
end;不管把dll中的AddLog 改为procedure还是Function,在exe中经常会出现内存不足;但是如果我把这个AddLog放在program 中就不会有问题.请问怎么办?怎么才能彻底释放dll内存和exe内存?
多谢,如果分数不够,还可以再加!
Function AddLog(datatemp:Tdatabase;Model:Tquery;userCode, opt: string;optDate,ExitDate:TDateTime):Boolean;
begin
with Model do
begin
Model.Close;
Model.SQL.Clear;
Model.SQL.Add('insert into f_code_log (userCode,opt,optDate,ExitDate) values( ');
Model.SQL.Add(' :userCode,');
Model.SQL.Add(' :opt,');
Model.SQL.Add(' :optDate,');
Model.SQL.Add(' :ExitDate)');
Model.ParamByName('userCode').Value:=userCode;
Model.ParamByName('opt').Value:=opt;
Model.ParamByName('optDate').Value:=optDate;
Model.ParamByName('ExitDate').Value:=ExitDate;
Model.ExecSQL;
end;
Result:=True;
end;不管把dll中的AddLog 改为procedure还是Function,在exe中经常会出现内存不足;但是如果我把这个AddLog放在program 中就不会有问题.请问怎么办?怎么才能彻底释放dll内存和exe内存?
多谢,如果分数不够,还可以再加!
解决方案 »
- 向“阿发伯”(maozefa)问下关于Delphi GDI+相关问题
- 如何将新窗体的类设置成我所定义的类
- form 中有30个edit,当第一个edit1获得焦点时,就开始输入,并且光标一直停留在edit1上,直到edit1的内容输入完成并正确,才能使edit2得到焦点?这怎么实现??
- 华为,又一个员工自我终结了生命。。。。。。。。
- 100分问:关于软件的字体转换的问题!!
- 关于SQL语句的问题
- 怎样调用CHM格式的帮助文件?
- 请问怎么做才可以在子类窗体中看到父类窗口中建立的控件呢?
- 如何在DBGRID中显示备注字段(ACCESS数据库)
- Delphi6 TAstaClientDataSet与TcxGrid控件关联问题
- 如何取得当前日期时间?
- 如何把dbgrid的某列分成若干小列。示意图如下。谢谢!
在Model.ExecSQL;之后加句Model.close;试试
Function AddLog(datatemp:Tdatabase;Model:Tquery;userCode, opt: string;optDate,ExitDate:TDateTime):Boolean;
begin
with Model do
begin
Model.Close;
Model.SQL.Clear;
Model.SQL.Add('insert into f_code_log (userCode,opt,optDate,ExitDate) values( ');
Model.SQL.Add(' :userCode,');
Model.SQL.Add(' :opt,');
Model.SQL.Add(' :optDate,');
Model.SQL.Add(' :ExitDate)');
Model.ParamByName('userCode').Value:=userCode;
Model.ParamByName('opt').Value:=opt;
Model.ParamByName('optDate').Value:=optDate;
Model.ParamByName('ExitDate').Value:=ExitDate;
Model.ExecSQL;
end;
Result:=True;
end;不管把dll中的AddLog 改为procedure还是Function,在exe中经常会出现内存不足;但是如果我把这个AddLog放在program 中就不会有问题.请问怎么办?怎么才能彻底释放dll内存和exe内存?
多谢,如果分数不够,还可以再加!
EXE:
---------------------------------------------------
function AddLog(datatemp:Tdatabase; Model:Tquery;
userCode, opt: string; optDate,ExitDate:TDateTime):Boolean; external 'Project1.dll' name 'AddLog';procedure TForm1.Button1Click(Sender: TObject);
begin
with (Self.Query1.Params.Add as TParam) do
begin
Name := 'userCode';
DataType := ftString;
Precision := 50;
end;
with (Self.Query1.Params.Add as TParam) do
begin
Name := 'opt';
DataType := ftString;
Precision := 50;
end;
with (Self.Query1.Params.Add as TParam) do
begin
Name := 'optDate';
DataType := ftDate;
end;
with (Self.Query1.Params.Add as TParam) do
begin
Name := 'ExitDate';
DataType := ftDate;
end; AddLog(Self.Database1, Self.Query1, 'rr', 'tt', Now(), Now());
end;配置一个ODBC DSN(名称为test),
Database1中配置一个Database(名称为tt,设置其ODBC DSN=test以及用户名,密码等),connected 为True
Query1,设置Databasename为tt
DLL:
---------------------------------------------------------
library Project1;
uses
ShareMem,
SysUtils,
Classes,
DBTables;function AddLog(datatemp:Tdatabase; Model:Tquery;
userCode, opt: string; optDate,ExitDate:TDateTime):Boolean;// stdcall;
begin
with Model do
begin
Model.Close;
Model.SQL.Clear;
Model.SQL.Add('insert into f_code_log (userCode,opt,optDate,ExitDate) values( ');
Model.SQL.Add(' :userCode,');
Model.SQL.Add(' :opt,');
Model.SQL.Add(' :optDate,');
Model.SQL.Add(' :ExitDate)');
Model.ParamByName('userCode').Value:=userCode;
Model.ParamByName('opt').Value:=opt;
Model.ParamByName('optDate').Value:=optDate;
Model.ParamByName('ExitDate').Value:=ExitDate;
Model.ExecSQL;
end;
Result:=True;
end;exports
AddLog name 'AddLog';begin
end.
1.建议用ADO,数据库MSSQL?;如果是Oracle,推荐用ODAC;BDE老麻烦的
2.尽量不要模块之间传递VCL组件,因为这样的话,就需要在library中引用ShareMem单元,使用Borland的内存管理机制(这个偶没仔细研究过...)。比如这个你可以在你library中动态创建TADOQurey(如果是ADO的话...),外部传入ConnectionString和 SQL string, 当然这样用的是短连接,用完通常就会把这个ADOQuery Free掉了
用dll传对象和string就一定要sharemem。只有这样2边才会共用一个内存管理器。