| 

.NET C# Java Javascript Exception

2
Hallo zusammen,

wie schaffe ich es, eine FileInfo als Parameter bei SQLite zu lesen? Die Spalte in der Tabelle ist BLOB, der Parameter ist so definiert:

com.Parameters.Add("@info", DbType.Object)
com.Parameters(11).Value = New FileInfo(filename)

Jetzt würde ich gerne folgendes Machen:

Dim rd As SQLiteDataReader = com.ExecuteReader
rd.Read()
Dim f2info As FileInfo = CType(rd.GetValue(0), FileInfo)

Was mir allerdings mit einem

"Das Objekt des Typs "System.Byte[]" kann nicht in Typ "System.IO.FileInfo" umgewandelt werden."

quittiert wird. Im Moment fehlt mir leider die Idee, wie ich das Ganze hinbekomme. Zumindest in der Tabelle ist die Spalte anscheinend richtig gefüllt.

Vielen Dank!
07.11.2016
muffi 1,4k 1 9
muffi 1,4k 1 9
2 Antworten
1
Hallo,

du kannst in der Datenbank nicht einfach eine FileInfo Instanz in einem BLOB Feld speichern.
Ich denke, dass der SQLite Provider deine FileInfo interpretiert und dann den Inhalt der Datei als byte Array abspeichert.

Also, der Inhalt der Datei kann recht einfach in ein BLOB Feld gespeichert und wieder geladen werden.

So in etwa (c#):
com.Parameters(11).Value = System.IO.File.ReadAllBytes(filename);


und auslesen in eine temp. Datei:
string lsTempFileName = System.IO.Path.GetTempFileName();
System.IO.File.WriteAllBytes(lsTempFileName, rd.GetValue(0) as byte[]);


Hoffe das hilft dir weiter.
07.11.2016
PinBack 687 1 8
Nein, das hilft mir leider nicht sonderlich weiter, weil ich die FileInfo selbst ja abspeichern will und nicht das ganze File.
Ich möchte die FileInfo abspeichern und lesen. Workarounds wären natürlich auch möglich (weil mir es im Prinzip nur auf eine geänderte Datei seit dem letzten "Besuch" ankommt).
muffi 07.11.2016
Die FileInfo besteht ja im wesentlichen aus dem Dateinamen. Reicht es da nicht einfach den Dateinamen abzuspeichern. Oder anders gefragt, was hast du mit der FileInfo nach dem laden vor?
PinBack 07.11.2016
Noch ein Zusatz: Wenn du eine Instanz einer Klasse abspeichern willst, würde ich ein CLOB Feld nehmen und das ganze als JSON (also als string) speichern.
PinBack 07.11.2016
Also, mal weiter von vorn... ich habe da so ein Projekt, wo ich immer mal wieder (zu Übungszwecken) irgendwas programmiere, was es schon millionenfach gibt. Im Moment teste ich mich an einer Dublettenprüfung (doppelte Dateien), deshalb ist mir im Prinzip auch nur das letzte Änderungsdatum wichtig.

Der Einfachheit halber wollte ich die FileInfo abspeichern, aber wenn das nicht geht, werde ich es wohl mit dem Datum versuchen. Ich inventarisiere alle Files eines Laufwerks mittels der FileInfo und überprüfe später, ob sich Dateien geändert haben. Ich denke, jetzt ist klar, was ich damit vorhabe.
muffi 07.11.2016
1
In dem Fall würde ich wirklich eine eigene Klasse mit Dateiname und letztem Änderungsdatum machen und das ganze als JSON in einem CLOB Feld abspeichern.
PinBack 07.11.2016
So ähnlich habe ich das jetzt auch gemacht. Ich werte jetzt das .LastWriteTime aus - reicht vollkommen für meine Zwecke. Danke!
muffi 08.11.2016
1
Wir haben ebenfalls mit derartigen Problemen Erfahrungen gesammelt (SQL-Server) und die Antwort geht ebenfalls in die Richtung von PinBack.

Bewährt haben sich eigene Klassen mit einer XML-Serialisierung und -Deserialisierung. JSON verwenden wir nicht so gern, da sich XML bei Bedarf validieren läßt.
Im Falle der FileInfo-Struktur würde ich also alle relevanten Felder in XML serialisieren und in einem geeigneten Feldtyp (SQLLite: CLOB; SQL-Server: XML-Feld) ablegen. Nach dem Einlesen des Feldes - beim SQL-Server auch direkt mit XPath - kann dann die Deserialisierung erfolgen und die notwendigen Operationen.

Ich würde für den Einsatzfall evt. noch weitere Felder ergänzen: Hash-Wert über den Dateiinhalt und Dateigröße. Durch die eigene Klasse ist man da flexibel.

Vielleicht hilft diese Erfahrung von unsrer Seite bei der Entscheidung der konkreten Implementierung weiter.
08.11.2016
edvservice 1,2k 6
Hash-Werte lege ich sowieso in der Tabelle mit ab (allerdings nicht die Größe, denn LastWriteTime ist da denke ich aussagefähiger; zudem wäre die Größe im FileInfo dabei), aber danke für den Hinweis!
Dein Kommentar ist eigentlich eine schöne Aufforderung bzw. Gelegenheit, sich mit der (De-)Serialisierung mit XML tiefer zu beschäftigen.
Nochmal Danke!
muffi 08.11.2016

Stelle deine .net-Frage jetzt!