TiffListe() As List(Of Image) - Kann man dies direkt in einer DB speichern?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von michl75.

    TiffListe() As List(Of Image) - Kann man dies direkt in einer DB speichern?

    Hallo,

    ich suche seit ner weile nach einer Antwort und Google mir schon die Finger wund :)

    Kann mal eine List(Of Image) in einer MS Sql Datenbank speichern?

    VB.NET-Quellcode

    1. ​Dim _r As List(Of Image) = New List(Of Image)()
    2. Dim bitmap As Bitmap = _Bmp_Subweit ' New Bitmap(sm)
    3. Dim count As Integer = bitmap.GetFrameCount(FrameDimension.Page)
    4. For idx = 0 To count - 1
    5. bitmap.SelectActiveFrame(FrameDimension.Page, idx)
    6. Dim byteStream As MemoryStream = New MemoryStream()
    7. bitmap.Save(byteStream, Imaging.ImageFormat.Tiff)
    8. _r.Add(Image.FromStream(byteStream))
    9. Next
    10. Return _r


    Das Ergebnis also Return _r direkt so in die DB speichern?

    Lg M

    michl75 schrieb:

    Das Ergebnis also Return _r direkt so in die DB speichern
    Welche DDB hast du denn?
    Im MS-SQL-Server kannst du den Datentyp BLOB verwenden.
    learn.microsoft.com/de-de/sql/…ver?view=sql-server-ver16

    Allerdings bläht das die Datenbank je nach Image-Größe ziemlich auf.
    Und du hast keinen echten Vorteil davon, weil du darauf die ganzen Vorteile, die eine Datenbank bietet, nicht anwenden kannst.
    Datenbank-Speicherplatz ist teuer.
    Häufig werden solche Daten in großen Systemen außerhalb der DB gespeichert und die DB beinhaltet nur einen Link auf die Daten.
    Bei On-Premises Systemen bietet sich dafür das Dateisystem an.
    Wenn du in der Azure Cloud arbeitest, verwende den Azure Blob Storage.

    In welcher Umgebung soll dein Projekt stattfinden?
    Wie hoch sind die Datenmengen?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Über die Datenmenge mach ich mir auch schon länger gedanken....

    Es werden mehrere tausend Dokumente da gespeichert werden. Von Angeboten (Ein- wie Ausgang), Auftragsbestätigungen, Lieferscheine ... einfach alles was an "Papier" so anfällt. Ursprünglich galt diese DB als Idee für nur technische Dokumente, aber nun soll alles rein.

    Wir selbst sind virtualisiert mit Proxmox. Dazu zwei Windows Server 2019 Std. Einer als DC und Filer-Server - ausreichend Platz für Dateien vorhanden und der andere ist rein nur der SQL Server.

    Also wäre es besser, die Daten mit zB einem 50stelligen Namen RandomString zu versehen (der natürlich einmalig sein muss) und diesen zur den Daten in der DB legen und wenn abgerufen wird, dann aus Dateisystem die jeweilige Datei laden ??

    michl75 schrieb:

    alles was an "Papier" so anfällt
    Also ein Dokumentenmanagementsystem.
    Die arbeiten üblicherweise allerdings mit Verschlagwortung.
    Oder sogar mit Volltextsuche.
    Wenn ich dich richtig verstanden habe, möchtest du allerdings lediglich das Bild abspeichern.
    Sind das PDFs oder JPGs?

    michl75 schrieb:

    mit zB einem 50stelligen Namen RandomString zu versehen (der natürlich einmalig sein muss)
    Vollständig Random muss das nicht sein.
    Du kannst evtl. auch einen Zeitstempel mit ablegen.

    Wie suchst und findest du diese "Papiere" später wieder?
    Mit Abspeichern allein ist es ja nicht getan.
    Speicherst du in der DB zusätzliche Infos zu diesem Dokument (ggf. Schlagworte)?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    "Also ein Dokumentenmanagementsystem" = Könnte man sagen ja, jedoch komplett in Vorgangsbearbeitung von Aufträgen und Kreditoren/Debitoren verstrickt ... also kein klassisches DMS.

    "Die arbeiten üblicherweise allerdings mit Verschlagwortung. Oder sogar mit Volltextsuche" = ja machen wir auch, meistens sinds PDF's, die ich aber umwandel zu Multipage TIFF's und dann wird der gesamte Text ausgelesen und in DB gespeichert....

    "Wenn ich dich richtig verstanden habe, möchtest du allerdings lediglich das Bild abspeichern." = ja, sowohl noch ein paar angaben (wie eben erwähnt) der enthaltene Text vom Dokument, die Größe in KB, evtl. noch ein kleines Thumbnail als JPG (aber das nicht wichtig, evtl. nur als kleines Plus mal) so wie die Seitenanzahl usw... also Paar Details zum Dokument.

    "Sind das PDFs oder JPGs?" = Eingehende Dokumente kann alles sein, PDF, JPG, PNG, TIFF, XML und später auch mal XRechnung bzw. dieses PDF mit Integrierter Rechnung (fällt der Name nicht ein gerade) ....
    Als Ausgabe bzw. Speicherung bei uns nur rein als TIFF. Dieses TIFF werde ich auch verschlüsseln wenn es als Datei auf der Fileserverplatte liegt und nicht mehr in der DB....

    "Zeitstempel" = Super Idee, ja klar... als Timestamp in Sekunden usw. + kleiner Random vllt. würde reichen.

    "Wie suchst und findest du diese "Papiere" später wieder?" =
    a. hat jeder Datensatz Felder zum Kreditorkonto oder Debitorkonto oder zu einem Vorgang (Angebot/Auftrag/Lieferschein usw.) Dazu KANN jeder Datensatz an Dokument mit anderen Dokumenten oder Vorgängen oder Kreditor/Debitor zusätzlich verknüpft werden (dafür geibt eine eigene Verknüpfungstabelle)
    b. Wird vom jedem Dokument der Text extrahiert und man kann in die Suche einbeziehen.

    "​Speicherst du in der DB zusätzliche Infos zu diesem Dokument (ggf. Schlagworte)?" = nein ... das läuft allein über Volltextsuche


    Ich hab mir vorhin nach deiner E-Mail einen Kaffee geholt und hab darüber nachgedacht. Es erscheint mir logisch und vernünftig, tatsächlich die Dokumente im Programm aufzunehmen, diese von -was auch immer Format- zum TIFF mutieren zu lassen, diese mit eindeutigen Namen zu versehen, klar vorher noch Text und Details entnehmen und ab in Datenbank und die Datei in ein entsprechendes Verzeichnis zu klatschen.

    Ich glaub du hast mich auf den richtigen Weg geführt... Vielen Dank dafür!

    michl75 schrieb:

    die Datei in ein entsprechendes Verzeichnis zu klatschen
    Hier vielleicht noch die Anmerkung:
    Es dürfen auch mehrere Verzeichnisse sein.
    Die Faustregel für NTFS ist: Bis 2.000 Dateien und/oder Unterverzeichnis pro Verzeichnis ist schnell.
    Darüber hinaus wird's langsamer.
    Ab 20.000 wird's lästig.

    Ich weiß nicht, was du insgesamt an Dateien erwartest.

    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Also über die nächsten 5 Jahre wollen wir auch noch techn. Dokumente erfassen ...

    Technische Dok's ca. 120.000 Dokumente
    Allgemein Verwaltung / Buchhaltung pro Jahr liegen wir bei rund 2000 Dokumente

    Ich überlege gerade nach einer Sinnvollen Aufteilung
    Nach Jahre oder nach anderen Kriterien