ClientDateSet:Cannot perform this operation on a closed dataset

文章描述了一种在Delphi三层DataSnap架构中使用AlphaControls优化界面时遇到的问题,即在窗口编辑时,ClientDataSet在关闭后重新打开时出现错误。通过搜索和排查,发现原因是TsDBEdit控件的OnChange事件导致数据集无法正常打开,最终解决方案是避免使用OnChange事件并添加额外按键触发数据更新。

     一、问题表现

    Delphi 三层DataSnap,使用AlphaControls控件优化界面,一窗口编辑时,出现下列错误提示:       

     编译通过,该窗口中,重新显示数据,下图:

    

    相关代码:

    

procedure TShowOld_1_Frm.Button7Click(Sender: TObject);
var SQL,ID:string;
    k,L:integer;
begin
  GroupBox4.Caption:=Button7.Caption;
  DateTimetoString(ID,'yyyy-MM-dd',now-100);
  SQL:='select * from 老人基本信息 where (分支='+#39+sFCID+#39+') ';
  SQL:=SQL+'and (入院日期>='+#39+ID+#39+') order by 入院日期';
  DataModule1.ClientDataSet1.Active:=False;
  DataModule1.ClientDataSet1.DataRequest(SQL);
  DataModule1.ClientDataSet1.Active:=True;
  ClientDataSet1.Data:=DataModule1.ClientDataSet1.Data;
  DataModule1.ClientDataSet1.Active:=False;
  L:=ClientDataSet1.RecordCount;
  SetSource(DataSource1);
  DBGridEh1.Columns[0].Title.Alignment := taCenter;
  DBGridEh1.Columns[0].Alignment:=taCenter;
  DBGridEh1.Columns[1].Title.Alignment := taCenter;
  DBGridEh1.Columns[1].Alignment:=taCenter;
  DBGridEh1.Columns[0].Width:=36;
  DBGridEh1.Columns[1].Width:=80;
//  sStatusbar1.Panels.Items[0].text:='    数据库:  '+IntToStr(L)+' 人信息';
end;

     问题是,首次都能正常显示(OnShow中执行代码),再次执行代码时,出现下列提示:

    二、搜索思路

    1、由提示“ ClientDataSet无法在关闭的数据集上执行此操作”,ClientDataSet上作文章。打开数据集时,每次打开换个ClientDataSet,是可以解决问题,但是,这太复杂了,也违背编程的原则。放弃此办法。

     2、在引起DBCombobox,有OnChange的控件,找原因。方法见我的别一文章:《AlphaControls控件TsDBCombobox出错:访问违规》

     3、逐个控件,进行查找,方法是屏蔽全部控件,逐个开放,检查是否出现错误。找到在 TsDBEdit控件时,使用OnChange,生成其它字段的数据,引起ClientDataSet不能进入Open状态。

      三、解决问题

      只能放弃使用OnChange事件。

      原因中使用控件AlphaControls,界面很好,但是重画窗口界面,比较复杂,要求不使用或少使用OnChange事件,引起不必要的麻烦。

      只能改变思路,加一按键实现“OnChange,生成其它字段的数据”。

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值