Datasnap客户端引发“无效序数”错误

时间:2018-08-13 07:10:16

标签: delphi datasnap delphi-10.2-tokyo

我创建了一个Datasnap服务器(使用向导的独立tcp / ip),并添加了以下服务器方法:

function TServerMethods1.GetSomeData(tablename : String): TDataSet;
var 
  qry: TSQLQuery;
begin
  qry := TSQLQuery.Create(nil);
  qry.SQLConnection := SQLConnection1;
  qry.SQL.Add('select *');
  qry.SQL.Add('from ' + tablename);
  qry.Open;
  Result := qry;
end;

在客户端,我有一个ClientModuleUnit和一条TSQLConnection->TsqlServerMethod->TDataSetProvider->TClientDataSet->DataSource->dBGrid链“已连接”,以从服务器中检索只读数据。有关于如何执行此操作的教程,而我已经使它起作用。

procedure TForm3.GetSomeDataClick(Sender: TObject);
begin
  if combobox1.ItemIndex > -1 then
  begin
    // ClientModule.SQLConnection1.Close;
    ClientModule.ClientDataSet1.Close;
    ClientModule.ClientDataSet1.Params.ParamValues['TableName'] := Trim(combobox1.Text);
    ClientModule.ClientDataSet1.Open;
  end;
end;

组合框1中有几个表名。第一次选择表时,将检索数据并填充DBGrid。如果然后选择的表的字段少于第一个表的表,则会收到 Invalid Ordinal 异常。 有趣的是,如果我选择的表首先包含较少的字段,那么第二个调用将使用第一个调用中的字段-不会显示所有字段。

Data.DBXCommon.TDBXValueList.GetValueType中出现了错误-太深,太复杂了,我无法理解。

当然,如果我关闭并打开Datasnap连接(上面已注释),则不会引发invalid ordinal消息,并且它会按我预期的那样工作。

这是错误,还是仅是对当前Datasnap(DBX)实现的限制?

1 个答案:

答案 0 :(得分:1)

此行为表示您的字段保留在两次调用之间。因此,在加载新数据之前,我将清除这些数据集(sqlServerMethod1和Clientdataset1)上的字段。

procedure TForm3.GetSomeDataClick(Sender: TObject);
begin
  if combobox1.ItemIndex > -1 then
  begin
    ClientModule.ClientDataSet1.Close;

    ClientModule.ClientDataSet1.FieldDefs.Clear;
    ClientModule.sqlServerMethod.FieldDefs.Clear;

    ClientModule.ClientDataSet1.Params.ParamValues['TableName'] := Trim(combobox1.Text);
    ClientModule.ClientDataSet1.Open;
  end;
end;