【问题标题】:Datasnap client raises "invalid ordinal" errorDatasnap 客户端引发“无效序数”错误
【发布时间】:2018-08-13 07:10:16
【问题描述】:

我创建了一个 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;

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

Data.DBXCommon.TDBXValueList.GetValueType 中提出了错误 - 对我来说太深奥太复杂了,真的。

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

这是一个错误,还是只是当前 Datasnap (DBX) 实现的限制?

【问题讨论】:

  • 我不在服务器或客户端创建任何持久性 (T) 字段或 TFieldDef。这里全是动态创作。

标签: delphi datasnap delphi-10.2-tokyo


【解决方案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;

【讨论】:

  • 这是一个很好的答案。我一直被这个问题困扰,并且很长时间以来一直在使用我的连接关闭解决方法。
猜你喜欢
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
  • 2017-10-19
  • 2016-03-15
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
相关资源
最近更新 更多