Einzelnen Beitrag anzeigen

Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: DataSnap überträgt kein Firebird Bynary Blob Feld

  Alt 7. Sep 2015, 18:16
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
  Mit Zitat antworten Zitat