Я создал сервер 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)?