SqlCe als Stream statt File

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

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von pascalts.

    SqlCe als Stream statt File

    Guten Morgen!

    Ich habe ein SQLite file, welches ich via io.compression als stream aus einem ZIP Archiv ziehe (damit ich das ZIP, welches ca 10k Dateien enthält nicht auspacken muss). Das klappt soweit gut. Danach ist es notwendig, die Datenbank zu upgraden. Leider habe ich keine Möglichkeit gefunden, das direkt mit dem stream zu machen, ich muss erst die Datenbank als Datei anlegen (ich speichere die DB im temporären Ordner).

    VB.NET-Quellcode

    1. 'DATENBANK ÖFFNEN
    2. Dim engine = New SqlCeEngine("Data source=" + tempsqlfile)
    3. 'DATENBANK UPGRADEN
    4. engine.Upgrade()


    Gern würde ich aber, da dieser Vorgang sehr oft wiederholt wird (gern 100 bis 200 mal innerhalb kurzer Zeit), Schreib- und Lesevorgänge auf der Festplatte vermeiden, diese kosten mir zu viel Zeit und sorgen für Verschleiß (insbesondere bei SSDs).

    Auch werde ich aus der DB später diverse Werte auslesen. Auch hier würde ich gern einen Festplattenzugriff vermeiden. Die SQL-Datei wird auch später nirgends benötigt sondern wird bisher immer direkt danach gelöscht.

    Gibt es eine Möglichkeit all dies im RAM zu machen, ohne die Festplatte zu benutzen?

    Danke!

    PS: Ich bin unterwegs in VisualStudio 2017 Enterprise in VB.net mit dem Zielframework 4.5.2 :!:
    Inhalt der DB in ein DataSet speichern und dann damit arbeiten... So als fixe Idee.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mrMo“ ()

    @ErfinderDesRades Ich habe mich jetzt mal damit beschäftigt. Entweder bin ich blind oder blöd. Oder beides. Wie bekomme ich konkret aus dem sqlcestream...

    VB.NET-Quellcode

    1. Using archiv As ZipArchive = ZipFile.OpenRead(pfad)
    2. Dim file As ZipArchiveEntry = archiv.GetEntry("C/KRC/User/ProjectRoot/" + robname.ToUpper + "/" + robname.ToUpper + ".wvs")
    3. Dim sqlcestream as Stream = file.Open()
    4. End Using

    ... alle Daten in ein DS? Ich dachte an den SqlCeDataAdapter. Doch wenn ich mir die MSDN Seite ansehe:

    VB.NET-Quellcode

    1. ​Try
    2. Dim strDataSource As String
    3. strDataSource = "" & _
    4. "Data Source = C:\Program Files\" & _
    5. "Microsoft SQL Server Compact Edition\v3.5\Samples\" & _
    6. "Northwind.sdf"
    7. Dim conn As New SqlCeConnection
    8. conn.ConnectionString = strDataSource & ";Password='<password>'"
    9. Dim selectCmd As SqlCeCommand = conn.CreateCommand
    10. selectCmd.CommandText = "SELECT * FROM Employees"
    11. Dim adp As New SqlCeDataAdapter(selectCmd)
    12. Dim ds As New DataSet
    13. ' Note: Fill will leave the connection in its original state;
    14. ' In this case, the connection was closed so it will be left closed
    15. adp.Fill(ds)
    16. Console.WriteLine(("The SqlCeDataAdapter succesfully filled " & _
    17. ds.Tables.Item(0).Rows.Count & " rows in the DataSet!"))
    18. Catch ds As Exception
    19. Console.WriteLine(ds.Message)
    20. Finally
    21. Console.WriteLine(vbNewLine & vbNewLine & vbNewLine & _
    22. "Press any key to continue...")
    23. Console.ReadKey()
    24. End Try


    Steht da wieder strDataSource = "" & _"Data Source = C:\Program Files\" & _"Microsoft SQL Server Compact Edition\v3.5\Samples\" & _"Northwind.sdf" was lesen aus einem File bedeutet...

    Help me ;(
    guck dir einfach mal die Dataset-Klasse im ObjectBrowser an - insbesondere all die verschiedenen Load-Methoden. Es sind welche dabei, die akzeptieren auch einen Stream.

    ah - nee, diese Load-Methoden erwarten keine Datenbank-Datei sondern eine Xml-Datei, die von einem Dataset geschrieben wurde.

    Also langer Rede kurzer Sinn: Man braucht überhaupt keine Datenbank - vor allem nicht wenn man alle Daten eh komplett im Speicher halten möchte.
    Erhebt sich die Frage nach deinen Vorgaben: Muss das sein, dass da eine Datenbank-Datei im Zip ist (wieso hat die eiglich die endung .wsv? )
    Weil eine Xml-Datei, vom Dataset direkt als xml geschrieben ist kompakter, als wenn das erst in eine SqlCE-transferiert wird.

    ErfinderDesRades schrieb:


    Erhebt sich die Frage nach deinen Vorgaben: Muss das sein, dass da eine Datenbank-Datei im Zip ist (wieso hat die eiglich die endung .wsv? )
    Weil eine Xml-Datei, vom Dataset direkt als xml geschrieben ist kompakter, als wenn das erst in eine SqlCE-transferiert wird.


    Ja, leider ist das so. Um es kurz zu spezifizieren:

    Das "ZIP" ist ein Backup einen KUKA-Roboters. Darin befindet sich das "WorkVisualFile" - eine Art Projektdatei. Diese endet zwar auf .wvs, ist aber eigentlich eine SQLite Datenbank (Version 3.5) die in ihren Spalten unter anderem Binär-Blobs enthält, welche mich im Endeffekt interessieren...

    Ich kann quasi nichts für den Datenmüll, den ich bekomme :D

    Ich habe mich nun schon fast damit abgefunden, dass das einlesen eines jeden Archives ca 15 Sekunden dauert... Im wesentlichen wegen des Festplattenzugriffs. Ungünstig ist nur, dass ich gern auch mal 500 Archive auf einmal verarbeiten möchte, was dann über 2 Stunden dauert und eine Qual ist.