全部分数问一个有难度的问题(高手进),解决了马上放分!!!(288分)

  • 主题发起人 主题发起人 xaxaxa
  • 开始时间 开始时间
X

xaxaxa

Unregistered / Unconfirmed
GUEST, unregistred user!
在我做的东西里面有一个公用的查找form,取名frmlookup,如果我在某个界面里面想查找某一固定字段的内容,点击查找button,过程 如下
procedure Tsccs.Button1Click(Sender: TObject);
begin
frmlookup.ShowModal;
end;
在frmlookup里面的edit输入要查找的内容 点击frmlookup里面的查找button
procedure TFrmLookup.SpeedButton3Click(Sender: TObject);
begin
queryfind(Querya ,tablex, fieldx);
end;
;//其中querya,tablex,fieldx对应的实际参数是主界面里面的query,
在主界面的formactive事件里面赋值了
procedure Tsccs.FormActivate(Sender: TObject);
begin
querya:=query1;
tablex:='员工表;
fieldx:='名称;
end;

其中queryfind是我的一个公共单元common里面定义的一个过程:
procedure queryfind(querya:tquery;tablex:string;fieldx:string);
begin
if querya<> nil then
begin
with Querya do
begin
close;
sql.clear;
sql.add('select * from '+tablex+ ' where ' +fieldx+ ' like ''%'+frmlookup.editlookup.Text+'%'' ');
open;
end;
end;
这只是我的一个界面里面用到了这个查找功能,其他的好多界面也用到了,现在的问题是在某些界面里面调出frmlookup点击查找的时候偶尔出现'连接占线导致另外一个hstmt',有的界面是99%的会出现,不知道是什么原因,苦恼了好久!
 
用的是delphi7.0+bde+sql server2000.sql server已经打上SP4的补丁,问题依旧,
有人说把BDE改成ADO、可是现在有几百个QUERY控件,改起来不现实。
 
'连接占线导致另外一个hsml'

是什么意思??没见过
 
querya对应的实际参数是主界面里面的query。是不是这的问题
你在查询的时候改为过滤,速度快
procedure queryfind(querya:tquery;tablex:string;fieldx:string);
begin
if querya= nil then raise exception.create('no query ');
querya.filter:=fieldx+ ' like ''%'+frmlookup.editlookup.Text+'%'' '
querya.filtered:=true;
end;
 
既然是公用的,那么最好每次用到的时候重新创建实例。

procedure Tsccs.Button1Click(Sender: TObject);
begin
frmlookup.ShowModal;
end;
改为:

procedure Tsccs.Button1Click(Sender: TObject);
var
frmCX : Tfrmlookup;
begin
try
frmCX := Tfrmlookup.Create(nil);
frmCX.Showmodal;
finally
frmCX.Free;
end;
end;

还有那个公用的查询里不要直接应用:frmlookup.edit.。。改为传参数过去;
 
楼主,你这样疯狂的转分小心被管理员封号哦:)
 
to rasa:
用你的方法实验了下没有出现占线的情况了,还在实验中,若没有问题下午结贴
 
如果你放分俺先蹭分
 
来晚了

procedure Tsccs.Button1Click(Sender: TObject);
var
frmCX : Tfrmlookup;
begin
try
frmCX := Tfrmlookup.Create(nil);
frmCX.Showmodal;
finally
frmCX.Free;
// 这里最好加一句
querya.close;
// 查询完了,应该关了它,留着它干吗?
end;
end;
 
占线依旧,.真郁闷
楼上:querya:=query1;
如果querya关闭的话query1是不是也关闭 了,可我要把数据集query1中的内容显示出来啊
 
每个调用frmlookup的地方(Button1Click)都得改成Rasa大侠说的形式。另外最好project->options->autocreate forms把frmlookup点到右边去。
 
to 楼上:我已经每个查找的地方都改了,并且project->options->autocreate forms把frmlookup点到右边去 也做过了,可是。。。。。
 
重新创建一个QUERY,用另外一个QUERY做这个事情吧.另外说明一下:
1、请不要将所有的操作update,delete ,select用一个QUERY做,最好UPDATE,DELETE共用一个QUERY,SELECT单独使用一个QUERY。
 2、当一个QUERY用完后,无比关闭掉。
 3、尽量少用(或根本不要用)unprepare,prepare.
以上都是个人经验之谈。
 
对于你多次调用并且公用的模块,窗体必须要重新创建;

而且要释放;
procedure Tsccs.Button1Click(Sender: TObject);
var
frmCX : Tfrmlookup;
begin
try
frmCX := Tfrmlookup.Create(self);
frmCX.Showmodal;
finally
frmCX := nil;
frmCX.Free;
end;
end;
另外
queryfin 中的query 也要创建后释放;同上
 
谢谢Rasa:
我有一个问题不明白,queryfind里面的querya怎么释放,因为querya:=query1;
如果加上一个querya.close的话查找的内容马上就消失了,释放掉不更不行了?
 
给我个DEMO吧 我给你看一下 panzichan@vip.sina.com
 
queryfind里面的querya不要通过窗体传输进去了。
直接在公用的模块使用不行吗?

或者queryfind(Querya ,tablex, fieldx);---
改为直接传一段SQL语句就是了;queryfind(sSQL : String)
queryfind 过程中
procedure queryfind(sSQL : String);
begin
with Querya do
begin
close;
sql.clear;
sql.add(sSQL);
open;
end;
end;
这样不需要传QUERY,窗体相对独立的;
 
谢谢楼上各位,正在实验,搞定的话马上结贴,尤其要谢谢Rasa大侠
 
这个问题简单,问题出在你调用的QUERY和窗口没有进行多个会话。造成QUERY或者FORM占用。
解决的方案很多。
第一:通过动态建立窗口,使用
with tform.create(nil) do
try showmodal;finally free;语句进行动态建立。
第二:动态建立QUERY,不要让QUERY相同。创建办法同上。
第三:就是使用SESSION。但是估计你还得使用动态建立。
第四:现在通常使用的方式,就是每个窗体放一个独立的QUERY,这个QUERY随窗口诞生而生,消亡而消亡。绝对没有问题。
至于通用函数更好写了,只要使用TDATASET就可以了。
procedure A(AQUERY:TQUERY或者TDATASET)
就可以了。
 
我按照rasa的方法改成
procedure TFrmLookup.SpeedButton3Click(Sender: TObject);
var stredit:string;
begin
stredit:=editlookup.text;
queryfind2('select * from '+tablex+ ' where ' +fieldx+ ' like ''%'+stredit+'%''');
end;


procedure queryfind2(strsql:string);
begin
if querya<> nil then
begin
with Querya do
begin
close;
sql.clear;
sql.add(strsql);
open;
end;
end;
end;
可是占线依旧,快疯了
 
后退
顶部