Hallo Uwe,
das mit dem Blob ist eine sehr gemeine Sache.
Das Bild wird Übertragen wenn ich nicht zu viele Datensätze habe!
Also nochmal: In meiner Tabelle habe ich etwa 550.000 Datensätze. Davon hat nur ein Datensatz ein kleiner Bild ca. 20KB.
Rufe ich genau diesen Dantesatz ab, ist das Bild enthalten.
Testweise habe ich einfach die PersonID + 200000 Datensätze abgerufen. Das Bild wird noch übertragen.
Erweitere ich jedoch den Range auf PersonID + 300000 werden alle Records übertragen jedoch nicht das Bild.
Die Records ruft der Client vom Server in ein lokales TDataSet ab. Danach wird per CopyDataSet in eine FDMemTable kopiert.
Es scheint also ein Speicherproblem zu sein. Doch leider bekomme ich keine Fehlermeldung.
//am Server
Delphi-Quellcode:
function TdmDAL.GetPERSON(conn:TFDConnection; PersonID: integer): TDataSet;
var
oQuery: TFDQuery;
begin
result := nil;
if conn=nil then exit;
oQuery := nil;
oQuery := TFDQuery.Create(nil);
try
TThread.Synchronize(nil, procedure
begin
oQuery.Connection := conn;
oQuery.FetchOptions.AutoFetchAll := afAll;
oQuery.FetchOptions.RecordCountMode := cmTotal;
oQuery.SQL.add('/*Eine Person abrufen*/');
oQuery.SQL.add('SELECT p.*');
oQuery.SQL.add(' FROM personen p');
// oQuery.SQL.add(' WHERE (p.personid :personid)');
// oQuery.ParamByName('personid').AsInteger := personid;
oQuery.SQL.add(' WHERE (p.personid between :personid1 and :personid2)');
oQuery.ParamByName('personid1').AsInteger := personid;
oQuery.ParamByName('personid2').AsInteger := personid+300000;
oQuery.Open;
end);
result := oQuery;
finally
// oQuery.Free;
end;
end;
//am Client
Delphi-Quellcode:
procedure TfrMain.Button9Click(Sender: TObject);
var LDataSet: TDataSet;
RecordCount:integer;
begin
if not dmComm.InitConnection(false) then Exit;
//Die Proxy Methode holt die aktuelle Connection und ruft damit die GetPERSON vom Server auf.
LDataSet := dmComm.ClientContainer.FProxyInst.GetPERSON(443025);
cxDBImage1.DataBinding.DataField := 'BILD';
cxDBImage1.DataBinding.DataSource := dsPersonen;
fdPersonen.CopyDataSet(LDataSet, [coStructure, coRestart, coAppend, coEdit]);
fdPersonen.Open;
fdPersonen.Locate('PERSONID',443025,[]);
end;
Kennst du diesen Fall?
Hier im Forum habe ich in anderen Beiträgen gelesen die über Speicherprobleme bei Binären Datenübertragung von DataSnap berichtet haben.
Mein aktuelles Problem könnte ich schon umschiffen wenn ich die Records mit den Bildern einzeln übertragen würde. Die Frage ist nur ist es
nur ein Problem von Bildern in Blobfeldern oder kann es passiert dass auch andere Feldinhalte plötzlich leer sind, String abgeschnitten werden,
oder Memos die RTF Texte beinhalten verworfen werden? Es ist also eine generelle Frage der Zuverlässigkeit von DataSnap in Verbindung mit
FireDAC.
Dir noch eine schöne Zeit.
Gruß Kostas