救急救急,数据更新不能及时显示的问题~~~在线等待送分!!!

keikai 2002-05-19 01:31:25
我有一个应用程序,同时开两个实例,访问数据库,数据的更新不能及时反映:
如下,
//主窗体 TMainForm
//菜单点击事件
procedure TMainForm.mSupplyClick(Sender: TObject);
var FrmSupply:TSupplyForm;
begin
FrmSupply:=TSupplyForm.Create(Self);
FrmSupply.ShowModal;
FrmSupply.Free;
end;

//数据显示、编辑窗体 TSupplyForm
//特别注明:TSupplyForm中有一个IBSupplyQuery,被界面上的
DBGrid使用;还有一个IBUpdateQuery,用来更新数据。
IBSupplyQuery的CacheUpdates被设置为false

//在窗体被创建的时候打开Query,并通过DBGrid显示出来
procedure TSupplyForm.FormShow(Sender: TObject);
begin
// IBSupplyQuery.Active:=True;
IBSupplyQuery.Open;
//IBSupplyQuery.Refresh;
end;
//关闭Query
procedure TSupplyForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
IBSupplyQuery.Active:=False;
end
;
procedure TSupplyForm.btnExitClick(Sender: TObject);
begin
Close;
end;

procedure TSupplyForm.btnRefreshClick(Sender: TObject);
begin
// IBSupplyQuery.Transaction.
IBSupplyQuery.Close;
IBSupplyQuery.Open;
end;
procedure TSupplyForm.btnEditClick(Sender: TObject);
begin
if (IBSupplyQuery.RecordCount>0) and (DBGrid1.SelectedRows.Count>0) then

begin
//...根据DBGrid中记录的值,构造IBSupplyUpdate的参数
//IBSupplyUpdate.ParamByName('NAME').AsString := 'abc';
IBSupplyUpdate.ExecSQL;
IBSupplyUpdate.Transaction.Commit;//提交事务,数据库中数据立刻更新
end;
end;

--

放几千爆竹,将穷鬼轰开,几年来被这小畜生弄得偶空手一双,
点数炷清香,把财神引进,从此后愿您老人家保佑俺腰缠万贯.
...全文
132 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
keikai 2002-05-19
  • 打赏
  • 举报
回复
这儿我又发现一个稍微好的方法,就是先把DATABASE.CloseDatasets一下。
不过,程序还是显得很慢~~~

楼上的老兄,你的方法好像比较烦啊~~
keikai 2002-05-19
  • 打赏
  • 举报
回复
刚刚在BCB版,那边的高手告诉我一个方法,极其土,我都不好意思这么做。呵呵~~~,但是,土办法有土办法的用处,他们说:
在IBQuery打开记录集的时候,先把数据库给Close;Open一下~~~
我一试,确实可以,但是,这样子,实在恐怖啊,变得很慢~~~
ihihonline 2002-05-19
  • 打赏
  • 举报
回复
with IBUpdateQuery do
begin
ParamByName('iGHDWSX').AsInteger:=SX;
ParamByName('iGHDWBH').AsString:=eGHDWBH.Text;
ParamByName('iGHDWMC').AsString:=eGHDWMC.Text;
ParamByName('iSZD').AsString:=eSZD.Text;
ParamByName('iBZ').AsString:=eBZ.Text;
//Prepare;
ExecSQL;
-》
sql-insert ..values(...)//不用你去fresh
keikai 2002-05-19
  • 打赏
  • 举报
回复
ForceRefresh我已经设置为True啦!
那个属性?CacheUpdates?还是BufferChunk?
CacheUpdates设置为False啦,
BufferChunk,这个值好像有关,他不能被设置为0,我设置其为1(默认1000)
ihihonline 2002-05-19
  • 打赏
  • 举报
回复
自动刷新,你确认没有?
keikai 2002-05-19
  • 打赏
  • 举报
回复
好像TIBQuery没有autofrech这个属性啊?其他类似也没有嘛~~
ihihonline 2002-05-19
  • 打赏
  • 举报
回复
你别有refresh
将Query.autofrech:= false;//close open后就应该可以了;
给它一定的绶存;
再者,你也可以用
insert语句,这样的话,它每一执行就提交了;
keikai 2002-05-19
  • 打赏
  • 举报
回复
照你的方法,不行的说~~~555555
现在的问题,不是第一个程序(暂且称之为AppA)的更新动作没有起作用,这句语句执行之后,数据库中已经被更新了。
问题在于,第二个程序(称之为AppB)的IBQuery读到的记录集,仍然是AppB启动时,从数据库那边得到的缓存,并没有真正到服务器端去读,如果,他去读了,那么结果肯定是正确的啦~~~
语句如下:
UPDATE SUPPLY SET
GHDWBH=:IGHDWBH,GHDWMC=:IGHDWMC,SZD=:ISZD,BZ=:IBZ
WHERE GHDWSX=:IGHDWSX;
bobit 2002-05-19
  • 打赏
  • 举报
回复
你在 Refresh; 之前加IBUpdateQuery.open;
bobit 2002-05-19
  • 打赏
  • 举报
回复
把它在程序中在更新一遍
bobit 2002-05-19
  • 打赏
  • 举报
回复
在IBUpdateQuery.SQL 中你是用的什么SQL语句(SQL)
keikai 2002-05-19
  • 打赏
  • 举报
回复
不行啊,我在Commit之后执行Refresh,就报错:
Can not perform operation on a closed dataset
语句如下:
if ShowModal=mrOK then
begin
with IBUpdateQuery do
begin
ParamByName('iGHDWSX').AsInteger:=SX;
ParamByName('iGHDWBH').AsString:=eGHDWBH.Text;
ParamByName('iGHDWMC').AsString:=eGHDWMC.Text;
ParamByName('iSZD').AsString:=eSZD.Text;
ParamByName('iBZ').AsString:=eBZ.Text;
//Prepare;
ExecSQL;
//UnPrepare;
Transaction.Commit();
Refresh;
end;
end;
bobit 2002-05-19
  • 打赏
  • 举报
回复
在它后面
keikai 2002-05-19
  • 打赏
  • 举报
回复
我这么写的时候,他给我一个错误啊~
说什么updatesql为空。
你是指在第一实例Commit的时候加这句,还是在另外一个实例打开窗口的时候加?
bobit 2002-05-19
  • 打赏
  • 举报
回复
IBSupplyQuery.resresh
keikai 2002-05-19
  • 打赏
  • 举报
回复
这条刷新语句如何写?(土土的问)
caoqizi 2002-05-19
  • 打赏
  • 举报
回复
在你提交时,用一个刷新语句对数据库进行刷新(Refresh),每次提交更新时都执行(Refresh),这样就可以得到即使跟新了,只不过在运行是速度慢了些.
lxpbuaa 2002-05-19
  • 打赏
  • 举报
回复
将TSupplyForm.FormClose去掉;
在TSupplyForm.FormShow中写:
IBSupplyQuery.Close;
IBSupplyQuery.Open;


—————————————————————————————————
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
I := TI.Create(Nil);
I.Maxim := MaximStr;
—————————————————————————————————


       
keikai 2002-05-19
  • 打赏
  • 举报
回复
不是这个问题啊,即便我再加上一条语句:
IBSupplyQuery.Close;
IBSupplyQuery.Open;
数据还是老样子,没有更新啊,其实也就是,读的记录一直都是本地的Cache。
僵哥 2002-05-19
  • 打赏
  • 举报
回复
用TTimer控件来定时更新吧。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧