AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datei über DataSnap Verbindung senden
Thema durchsuchen
Ansicht
Themen-Optionen

Datei über DataSnap Verbindung senden

Ein Thema von WorstNightmare · begonnen am 5. Jan 2009 · letzter Beitrag vom 21. Jan 2011
Antwort Antwort
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#1

Datei über DataSnap Verbindung senden

  Alt 5. Jan 2009, 21:51
Datenbank: DataSnap • Version: 12 • Zugriff über: SQLConnection + SQLServerMethod
Hallo,

ich "missbrauche" eine DataSnap Datenbank Verbindung für einen Remote-Explorer. Der Server läuft auf einem Rechner im Keller und der Client soll mir bestimmte Ordner auf seiner Festplatte anzeigen. Ich möchte nicht einfach normale Windows-Freigaben benutzen, da ich spezielle Shortcuts und andere Funktionen einbauen möchte. Nun bringt es mir nichts die Dateien einfach nur anzukucken, sondern würde ich sie auch gerne runter- und neue Inhalte hochladen.
Das Durchsuchen alleine klappt ganz gut, aber das Runterladen scheitert ab einer Dateigröße > 29 KB.
Die GetFile Methode auf dem Server sieht so aus:
Delphi-Quellcode:
function TDSServerModule1.GetFile(Filename: string): TMemoryStream;
begin
  Result := TMemoryStream.Create;
  Result.LoadFromFile(Filename);
end;
und der Client ruft sie so auf:
Delphi-Quellcode:
function TForm2.GetFile(Filename: string): Integer;
var
  Svr: TDSServerModule1Client;
begin
  Svr := TDSServerModule1Client.Create(SQLConnection1.DBXConnection);
  try
    Result := Svr.GetFile(Filename).Size;
  finally
    FreeAndNil(Svr);
  end;
end;
Und wiegesagt, wenn die angeforderte Datei > 29 KB, dann hat der MemoryStream eine Größe von -1. Lässt sich das irgendwie umgehen oder ist diese Datenbank einfach nicht dazu gemacht große Datenmengen aufeinmal zu übertragen? Ich möchte mich ungern mit Socketprotokollen etc. herumschlagen, diese Methode hier erscheint mir viel einfacher
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.314 Beiträge
 
Delphi 12 Athens
 
#2

AW: Datei über DataSnap Verbindung senden

  Alt 19. Jan 2011, 16:27
Hänge grade am selben Problem.

Ich hab aber schon rausgefunden, daß man Delphi-Referenz durchsuchenTDSTCPServerTransport.BufferKBSize auch ändern kann.
Durch dieses stehen für eine Übertragung insgesammt nur diese Datenmenge zur Verfügung.

29 KB + die restlichen Felder und Zusatzdaten <= BufferKBSize


Nun kann man BufferKBSize zwar maximal auf 1000 setzen (also ~0,98 MB, wobei diese Grenze in der OH natürlich wiedermal nicht drinsteht).

Aber dennoch kommt bei mir ein Stream (TIFF) mit nur 160 KB einfach nicht an, wärend es eine knapp 800 KB Textdatei schafft.
hatte mich wohl vermessen



Nun die Frage(n):

Warum kommen nicht alle Dateien durch?

Und wieso wirft das blöde DataSnap keine Fehlermeldung, wenn der Stream zu groß ist?


[edit]
Eigentlich dachte ich erst, daß DataSnap mit irgendwelchen Bytes/Bytefolgen in der Binärdatei nicht klarkommt, aber es liegt einfach nur daran, daß Dateien ab genau 64 KB (also >= 64KB) ebenfalls nicht durchkommen.
Also selbst wenn man BufferKBSize bis auf 1000 KB hochsetzen kann, muß ein Stream dennoch kleiner als 64 KB sein.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (19. Jan 2011 um 17:30 Uhr)
  Mit Zitat antworten Zitat
Piethan

Registriert seit: 2. Jun 2008
Ort: Köln
43 Beiträge
 
Delphi XE Architect
 
#3

AW: Datei über DataSnap Verbindung senden

  Alt 19. Jan 2011, 18:26
Ich würde statt Datasnap direkt auf Indy zugreifen. Ich versende z.B. so einen Stream:

Delphi-Quellcode:
begin
                  sinput:=IOHandler.ReadLn;
                  try
                     memo1.Lines.Add('Lade: '+sinput);
                     dm_vvk.cs_get_user.Params.ParamByName('iuser').AsString:=sinput;
                     dm_vvk.cs_get_user.Open;
                     stream := TMemoryStream.Create;
                     vtable:= TVirtualTable.Create(self);
                     vtable.Assign(dm_vvk.cs_get_user);
                     buf:=nil;
                     vtable.SaveToStream(stream,True);
                     IOHandler.Write(stream,0,true);
                     buf:= nil;
                     vtable.Free;
                     stream.Free;
                  finally

                  end;
Und lese den Stream beim Client so ein:

Delphi-Quellcode:
    stream:= TMemoryStream.Create;
    abuf:= nil;
    IdTCPClient1.IOHandler.WriteLn('3');
    IdTCPClient1.IOHandler.WriteLn(aactuser.username);
    IdTCPClient1.IOHandler.ReadStream(stream);
    Vtuser.LoadFromStream(stream,true);
    Vtuser.Active:=true;
    stream.Clear;
LG
Dirk
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.314 Beiträge
 
Delphi 12 Athens
 
#4

AW: Datei über DataSnap Verbindung senden

  Alt 20. Jan 2011, 09:14
Nja, DataSnap ist halt soooooo cool und new-style, da wollten wir es mal ausprobieren.

Es kann doch nicht sein, daß soein hochbeworbenes Produkt derartig beschränkt und fehleranfällig ist.

Wenn es aber so gedacht ist, dann sollte man wenigstens solche Beschränkungen auch nennen und mit entsprechenden Fehlermeldungen behandeln.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
DSCHUCH

Registriert seit: 6. Jun 2007
Ort: Dresden
185 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: Datei über DataSnap Verbindung senden

  Alt 20. Jan 2011, 12:36
ich war auch der meinung das beruht auf indy, oder liege ich da falsch?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.314 Beiträge
 
Delphi 12 Athens
 
#6

AW: Datei über DataSnap Verbindung senden

  Alt 20. Jan 2011, 12:57
Jupp, irgendwo im Inneren kommt dann Indy und ich glaub ein DataSet war auch irgendwo mit dabei.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz