Willkommen bei Entwickler-Forum.
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 10 von 16
  1. #1
    Zaungast
    Registriert seit
    05.03.2006
    Beiträge
    49

    Standard Sql Tabelle mit memorystream übertragen

    Hallo Leute,

    wie kann man eine komplette SQL Tabelle bzw. einen Datensatz in einen Stream verschicken vom IdTcpServer zum IdTcpClient ?
    Folgendes Problem stellt sich neuerdings...
    Auf einem Server habe ich MSSQL 2014.
    in dem Server sind Tabellen mit unterschiedlicher Struktur abgelegt.
    Strings, Integer, Datetime, Blobs usw.
    Nun möchte ich die Tabelle in einem Rutsch via Stream zum Client übertragen, wo eine lokale SQLite DB liegt mit der gleichen Struktur wie auf dem SQL Server.
    Zur Zeit wandele ich jeden DatenSatz über DataType des Feldes in eine String um und versende die Datensätze bzw. den Record mittels einer Stringliste.
    Solange kein BlobField auftaucht in der Tabelle geht das auch gut.
    Wenn ich nun aber ein Blobfield in der Tabelle habe muss ich den Umweg über einen FileStream machen, um den Inhalt des Feldes zu übertragen.
    Das macht einen grossen Aufwand an Abfragen nötig.
    Nun denke ich, das es auch einfacher gehen muss, wenn man den Datensatz unabhängig vom Datatype des Feldes in einen Stream packt, den zum Client sendet und dort wieder in die lokale Tabelle einfügt.
    Nun habe ich schon viel gegoogelt aber nichts passenden gefunden was mein Problem irgendwie lösen kann.
    Hat von euch jemand eine Idee oder einen Codeschnipsel wie ich das anpacken kann ?

    Vielen Dank für Eure Anregungen.

    Gruss Gerhard
    Geändert von Gerhard Wascinski (23.12.2016 um 14:02 Uhr)

  2. #2
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.176

    Standard

    Zitat Zitat von Gerhard Wascinski Beitrag anzeigen
    wie kann man eine komplette SQL Tabelle bzw. einen Datensatz in einen Stream verschicken vom IdTcpServer zum IdTcpClient ?
    Muss es unbedingt ein Stream sein? Unbedingt für BLOB?
    Worauf ich hinaus will:
    Was Du machst klingt im Prinzip nach Replikation.
    Bei MSSQL als Server gibt es Replikationsmechnismen. Ich schätze, statt sqLite nimmt man dann vlt eher SQL Express (früher MSDE, bin da nicht ganz auf dem Laufenden)

    Also bevor Du Dir irgendwelche Spezialitäten zusammenstrickst, mal ein Schritt zurücktreten und Überblick verschaffen.
    Fall es dann doch wirklich ein Stream sein soll ok. Oder falls es ohne SQLExpress / ohne MS Speziallösung gehen soll.
    Gruß, defo

  3. #3
    Zaungast
    Registriert seit
    05.03.2006
    Beiträge
    49

    Standard

    Hallo defo,

    im Prinzip ist es eine Replikation, allerdings ist der Hintergrund folgendes:
    Wir haben eine zentrale Datenbank in der Firma auf einem Server liegen. Für die Aussendienstmitarbeiter ist es wichtig, das bestimmte Daten lokal auf dem Laptop verfügbar sind um bei nicht vorhandener Internetverbindung trotzdem wichtige Daten zur Verfügung zu haben.
    Aber nicht alle Daten sind notwendig und es soll möglichst einfach zu handhaben sein.
    Daher eine SQLite lokal auf dem Laptop.
    Bisher war es auch nicht notwendig, Bilder oder PDFs bzw. Office-Dateien lokal zur Verfügung zu haben. Daher überträgt das Programm bisher per Stringlisten die Daten vom Server zum Client.
    Durch struktuelle Änderungen in unserer Firma zum 1.1.2017 liegt aber jetzt die Anforderung auf dem Tisch.
    Die Tabellen um Blobfelder zu erweiteren ist keine grosse Sache. Ebenso die Tabellen auf dem Client in der SQLite DB anzupassen.
    Wenn ich aber nun zur Übertragung von Blobfeldern vom Server zum Client Streams bemühen muss um diese zu senden bzw. zu empfangen dann macht es doch Sinn, gleich alle Felder der Datensätze in einer Zentralen Routine im Stream zu übertragen.
    Die Idee ist, den Stream zu erzeugen, dann die Größe jedes Feldes auf den Stream schreiben und dann den Feldinhalt gleich hintendran, unabhängig davon, was für einen "datatype" das Feld hat.
    Dann den Stream übertragen und im Client wieder einlesen. So erspare ich mir dann die Abfragen auf die Tabellen, ob Blobfelder vorhanden sind oder nicht, um die Blobfelder dann extra per Stream zu übertragen.
    Allerdings habe ich wenig Erfahrung mit Streams wie man sowas realisieren kann. Daher die Anfrage hier im Forum, wo man doch oft gute Denkansätze für Lösungen erhalten kann.

    Gruss Gerhard

  4. #4
    Forenheld
    Registriert seit
    26.02.2003
    Beiträge
    16.096

    Standard

    SQLite kann XML. Wahrscheinlich wohl auch die ServerDB. Mal prüfen, ob man nicht die Tabelle, die Datensätze so überträgt und dann einfügt
    Christian

  5. #5
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.176

    Standard

    Zitat Zitat von Gerhard Wascinski Beitrag anzeigen
    im Prinzip ist es eine Replikation, allerdings .. ist der Hintergrund folgendes:

    Daher eine SQLite lokal auf dem Laptop.

    Wenn ich aber nun zur Übertragung von Blobfeldern vom Server zum Client Streams bemühen muss..

    Allerdings habe ich wenig Erfahrung mit Streams wie man sowas realisieren kann.

    Daher die Anfrage hier im Forum, wo man doch oft gute Denkansätze für Lösungen erhalten kann.
    Replikation ist Replikation. Daher SQLite? Woher? SQLite lokal zur Datenhaltung ist sicher keine schlechte Wahl, aber..
    Warum musst Du Streams bemühen? Und ja, wenn es so ist, dann kannst Du vielleicht auch den Rest damit erledigen. Aber Du hast keine Erfahrung mit Streams.

    (gute) Denkansätze.

    Dein Master ist eine (neue) MS SQL DB, kommerziell mit viel Schnickschnack. Dazu gibt es Express Editionen z.B. für lokale Replikation geschenkt, die Express Edition ist sozusagen der lokale Natural Fit zum Master statt SQLite. Damit sollte Replikation ganz gut funktionieren.
    Du kannst natürlich, weil Du die Herausforderung liebst, auch andere Ansätze verfolgen.

    Hier mal 2. Treffer von oben nach grober Recherche:
    https://technet.microsoft.com/de-de/...ql.90%29.aspx#
    Etwas veraltet, es sollte aber viele andere brauchbare Doku dazu geben.

    @Christian:
    Seit wann kann SQLite XML? Meinst Du vielleicht den SQLite XML Editor?
    Gruß, defo

  6. #6

  7. #7
    Zaungast
    Registriert seit
    05.03.2006
    Beiträge
    49

    Standard

    Hallo defo, hallo Christian,

    xml ist ein möglicher guter Ansatz. Muss mal recherieren, wie man damit am besten umgeht.

    Ein SQL Express Version dient als Serverapplikation.

    Auf den Client-PCs darf ich keine SQL-Server Version einsetzen sondern nur eine kleine Datenbank, die exklusiv von der ClientApp verwendet wird.
    Darum SQLite, die man ja auch einfach verschlüsseln kann.
    An der Vorgabe komme ich nicht vorbei, insofern ist die Replikation im eigendlichem Sinne nicht machbar.

    Es funktioniert ja auch alles ganz gut bisher.
    Lediglich die Forderung auch Blobfelder mit synchronisieren zu müssen liegt auf dem Tisch.
    Das muss doch eigentlich machbar sein, ohne den Programmcode gross ändern zu müssen.
    Blobfelder als Strings zu übertragen wird wohl schlecht machbar sein oder ?
    Daher die Idee über einen Memorystream.

    Gruss Gerhard

  8. #8
    Forenheld
    Registriert seit
    26.02.2003
    Beiträge
    16.096

    Standard

    Nein, keine gute Idee BLOB als String ohne weitere Konvertierung zu übertragen. Wenn dann BASE 64 kodiert o.a.

    Nun die VCL Zeiten sind lange her, aber m.E. war ein Memorystream etwas für den Speicher...nix zum übertragen.
    Christian

  9. #9
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.176

    Standard

    Zitat Zitat von Gerhard Wascinski Beitrag anzeigen
    H

    Auf den Client-PCs darf ich keine SQL-Server Version einsetzen sondern nur eine kleine Datenbank, die exklusiv von der ClientApp verwendet wird.

    Lediglich die Forderung auch Blobfelder mit synchronisieren zu müssen liegt auf dem Tisch.
    Hättest Du auch gleich sagen könne.

    Es gibt
    TBlobfield.LoadFromStream
    TBlobfield.SaveToStream

    http://www.delphipraxis.net/117340-b...-anzeigen.html

    oder Load/Save|From|To<file>
    http://stackoverflow.com/questions/1...sql-parameters
    Gruß, defo

  10. #10
    Zaungast
    Registriert seit
    05.03.2006
    Beiträge
    49

    Standard

    Hallo Christian, Hallo Defo,

    Manchmal sieht man den Wald vor lauter Bäumen nicht....
    In der Hilfe zu Delphi steht, das man Blobs per "AsWideString" in eine StringList integrieren kann... Tests zeigen bisher, dass das auch sogar funktioniert. <freu>
    Das würde bedeuten, das ich über den .DataType nur eine weitere Zeile in der Case Anweisung einfügen muss...

    Das zweite ist: wie defo sagt....

    alle Felder in ein Blobfeld übertragen und dann mit blob.SaveToStream schreiben und im Client mit Blob.Loadfromstream wieder einlesen...
    Tests zeigen, das auch das funktioniert... <freu>

    Mal schauen, ob alle Sub-Routinen mit dem angepassten Routinen klar kommen, aber es sieht erstmal gut aus...

    Vielen Dank für eure Denkanstösse.... werde Euch auf dem laufendem halten....

    Gruss Gerhard.

 

 
Seite 1 von 2 1 2 LetzteLetzte

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •