unit DynSQLMainClient; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uROWinInetHttpChannel, uROClient, uROBINMessage, StdCtrls, Spin, uDADataTable, DB, Grids, DBGrids, uRORemoteService, uDAScriptingProvider, ExtCtrls, DBCtrls, uDARemoteDataAdapter, uDADataStreamer, uDAInterfaces, uDABin2DataStreamer, uDAMemDataTable; type TDynSQLMainClientForm = class(TForm) ROBINMessage: TROBINMessage; ROWinInetHTTPChannel1: TROWinInetHTTPChannel; Memo: TMemo; seMaxRecs: TSpinEdit; Label1: TLabel; RetrieveSchema: TButton; DataStreamer: TDABin2DataStreamer; DataTable: TDAMemDataTable; Grid: TDBGrid; DADataSource: TDADataSource; svcDynSQLService: TRORemoteService; RetrieveData: TButton; RetrieveSchemaAndData: TButton; Save: TButton; Load: TButton; Update: TButton; dbNavigator: TDBNavigator; DARemoteDataAdapter: TDARemoteDataAdapter; cbUpdateviaRDA: TCheckBox; procedure RetrieveSchemaClick(Sender: TObject); procedure RetrieveDataClick(Sender: TObject); procedure RetrieveSchemaAndDataClick(Sender: TObject); procedure SaveClick(Sender: TObject); procedure LoadClick(Sender: TObject); procedure UpdateClick(Sender: TObject); procedure DataTableBeforeRefresh(DataTable: TDADataTable); private { Private declarations } fSavedTablename: String; procedure InitRDA(aIncludeSchema: Boolean; AMaxRecords: integer); public { Public declarations } end; var DynSQLMainClientForm: TDynSQLMainClientForm; implementation uses DynSQLLibrary_Intf, uROTypes, uDARemoteDataAdapterRequests, uRODL; {$R *.dfm} procedure TDynSQLMainClientForm.RetrieveSchemaClick(Sender: TObject); begin InitRDA(True, 0); DataTable.Close; end; procedure TDynSQLMainClientForm.RetrieveDataClick(Sender: TObject); begin InitRDA(False, seMaxRecs.Value); end; procedure TDynSQLMainClientForm.RetrieveSchemaAndDataClick(Sender: TObject); begin InitRDA(True, seMaxRecs.Value); end; procedure TDynSQLMainClientForm.SaveClick(Sender: TObject); begin DataTable.SaveToFile(ExtractFilePath(Application.ExeName) + 'Data.dat'); end; procedure TDynSQLMainClientForm.LoadClick(Sender: TObject); begin DataTable.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Data.dat'); end; procedure TDynSQLMainClientForm.UpdateClick(Sender: TObject); var deltadata, r: Binary; begin if not DataTable.Active then begin ShowMessage('Please open table'); Exit; end; if DataTable.Delta.Count=0 then begin ShowMessage('No changes are found'); Exit; end; fSavedTablename:=InputBox('Enter table name','Please enter table name.'+sLineBreak+'Use an empty table name for fake update.',fSavedTablename); if cbUpdateviaRDA.Checked then begin DARemoteDataAdapter.UpdateDataCall.ParamByName('aTableName').AsString:= fSavedTablename; DataTable.ApplyUpdates(); end else begin deltadata := Binary.Create; try // Packs the delta of the data table and sends it over. DataStreamer.Initialize(deltadata, aiWrite); try DataStreamer.WriteDelta(DataTable); finally DataStreamer.Finalize; end; r:=(svcDynSQLService as IDynSQLService).MyUpdateData(fSavedTablename,deltadata); try DataTable.Delta.Clear(); DataStreamer.Initialize(r, aiReadFromBeginning); try DataStreamer.ReadDelta(DataStreamer.DeltaNames[0], DataTable.Delta); finally DataStreamer.Finalize; end; DataTable.MergeDelta; finally r.Free; end; finally deltadata.Free; end; end; end; procedure TDynSQLMainClientForm.DataTableBeforeRefresh(DataTable: TDADataTable); begin DaRemoteDataAdapter.GetDataCall.ParamByName('aSQLText').AsString := Memo.Lines.Text; end; procedure TDynSQLMainClientForm.InitRDA(aIncludeSchema: Boolean; AMaxRecords: integer); begin with DataTable do begin Close; DARemoteDataAdapter.GetDataCall.ParamByName('aSQLText').AsString := Memo.Lines.Text; MaxRecords := AMaxRecords; DARemoteDataAdapter.Fill([DataTable], true, aIncludeSchema); end; end; end.