代码之家  ›  专栏  ›  技术社区  ›  Freddie Bell

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

  •  0
  • Freddie Bell  · 技术社区  · 6 年前

    我创建了一个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。如果我选择一个字段少于第一个表的表,我将得到一个 例外。 有趣的是,如果我首先选择一个字段较少的表,那么第二个调用使用第一个调用中的字段,而不是显示所有字段。

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

    invalid ordinal 消息没有被提出,它按我的预期工作。

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Marc Guillot    6 年前

    此行为意味着您的字段保留在调用之间。因此,在用新数据加载这些数据集(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;