Datasnap 客户端引发 "invalid ordinal" 错误
Datasnap client raises "invalid ordinal" error
我创建了一个 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
链 "wired up" 从服务器检索只读数据。有关于如何做到这一点的教程,我已经做到了。
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 中有几个 table 名称。我第一次 select a table 检索数据并填充 DBGrid。如果我随后选择字段少于第一个 table 的 table,我将得到一个 Invalid Ordinal 异常。 有趣的是,如果我首先选择字段较少的 table,那么第二次调用会使用第一次调用中的字段 - 而不是显示所有字段。
错误出现在 Data.DBXCommon.TDBXValueList.GetValueType
- 太深奥复杂了,我真的无法理解。
当然,如果我关闭并打开 Datasnap 连接(如上评论),则不会出现 invalid ordinal
消息,它会按我预期的那样工作。
这是一个错误,还是只是当前 Datasnap (DBX) 实施的限制?
此行为意味着您的字段在调用之间保留。所以我会在用新数据加载它们之前清除这些数据集(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;
我创建了一个 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
链 "wired up" 从服务器检索只读数据。有关于如何做到这一点的教程,我已经做到了。
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 中有几个 table 名称。我第一次 select a table 检索数据并填充 DBGrid。如果我随后选择字段少于第一个 table 的 table,我将得到一个 Invalid Ordinal 异常。 有趣的是,如果我首先选择字段较少的 table,那么第二次调用会使用第一次调用中的字段 - 而不是显示所有字段。
错误出现在 Data.DBXCommon.TDBXValueList.GetValueType
- 太深奥复杂了,我真的无法理解。
当然,如果我关闭并打开 Datasnap 连接(如上评论),则不会出现 invalid ordinal
消息,它会按我预期的那样工作。
这是一个错误,还是只是当前 Datasnap (DBX) 实施的限制?
此行为意味着您的字段在调用之间保留。所以我会在用新数据加载它们之前清除这些数据集(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;