Rubrik: Datenbanken | VB-Versionen: VB2010 - VB2015 | 08.06.20 |
Einspeichern und Auslesen von Fileinhalten als Bytes in ein Datenfeld einer SQL-Tabelle Es werden Methoden (Funktionen) vorgestellt, mit denen Fileinhalte als Byte-Felder in einer SQL-Tabelle gespeichert und abgerufen werden können. | ||
Autor: Dietrich Herrmann | Bewertung: | Views: 2.269 |
ohne Homepage | System: Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Ich wollte gerne einige kürzere Audio-Files in meiner SQL-Tabelle speichern, um sie dann in Projekten leicht abrufen und letztendlich auch abspielen kann. Das Verfahren mittels meiner Funktionen kann auch für andere geeignete File-Inhalte angewandt werden.
Für die genannten Aufgaben veröffentliche ich zwei Funktionen.
1. Das Speichern von Fileinhalten als Byte-Felder im Datenfeld einer SQL-Tabelle
Diese Funktion realisiert das Speichern von einem File-Inhalt als Bytes ins gewünschte Datenfeld der SQL-Tabelle.
Das betreffende Datenfeld muss in der Tabellen-Definition mit dem Datentyp varbinary(MAX) definiert werden.
Die Funktion arbeitet folgendermaßen:
Als Parameter sind zunächst die SQL-Connection anzugeben. Als nächstes ein String für das INSERT eines neuen Datensatzes. Dieser String muss die übliche Definition der Datenfelder und deren zugehöriger Werte enthalten,
insbesondere natürlich den Datenfeldnamen für die Bytes-Daten und dessen Wert. Dieser Wert ist in diesem Falle ein File-Inhalt, der in der Funktion als Stream in ein Byte-Feld gelesen wird. Dieses Byte-Feld wird dann
mittels SqlCommand über den INSERT-String in die Datentabelle geschrieben (eine Modifikation wäre eventuell nicht INSERT sondern ein UPDATE, wenn vorhandene Datensätze nur ergänzt werden sollen).
Beispiel für INSERT:
Dim insStrAudio As String = "INSERT INTO myTable (Audio) Values(@File)"
Dabei ist myTable der Name der SQL-Tabelle, Audio bspw. der Datenfeldname für die Bytes.
Als zweiter Parameter der Funktion ist der möglichst komplette (Laufwerk, Pfad, Dateiname) Filename des zu speichernden Files anzugeben.
''' <summary> ''' Funktion zum Speichern von File-Inhalten in Form von Bytes in eine SQL-Tabelle ''' </summary> ''' <param name="connection">die SQL-Connection</param> ''' <param name="theInsStr">der String für das Insert in die Tabelle</param> ''' <param name="theFilePath">der komplette Filename (inkl. Laufwerk u. Pfad)</param> Public Sub databaseFileToBytes(connection As SqlConnection, theInsStr As String, theFilePath As String) Dim file As Byte() ' einlesen des Files in Bytes Using stream = New FileStream(theFilePath, FileMode.Open, FileAccess.Read) Using reader = New BinaryReader(stream) file = reader.ReadBytes(stream.Length) reader.Dispose() End Using stream.Dispose() End Using ' speichern des Files als Bytes connection.Open() Using sqlWrite = New SqlCommand(theInsStr, connection) sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file sqlWrite.ExecuteNonQuery() sqlWrite.Dispose() End Using connection.Close() End Sub
2. Das Auslesen von Bytes aus der SQL-Tabelle und Speichern in ein File
Diese Funktion dient dem Auslesen von in einer SQL-Tabelle gespeicherten Byte-Feldern und dem Speichern in ein entsprechendes File.
Als Parameter zunächst die SQL-Connection angeben. Als nächste Prameter ein SELECT-String zur Auswahl der gewünschten Zeile der Tabelle. Hier wird angegeben, welches Datenfeld die Bytes-Daten enthält und die Bedingung zur Auswahl des Datensatzes mittels WHERE.
Beispiel für SELECT:
Dim selStr As String = "SELECT Audio FROM myTable WHERE myID = " + "'" + myIDValue + "'"
Dabei ist myTable der Name der SQL-Tabelle, Audio bspw. der Datenfeldname der Bytes.
myID ist der Name eines Ident-Feldes über das ein Datensatz eindeutig definiert werden kann und myIDValue ist dann der Wert des Ident-Feldes.
Der dritte Parameter der Funktion muss möglichst den kompletten (Laufwerk, Pfad, Dateiname) Filenamen des zu speichernden Files enthalten.
''' <summary> ''' Funktion zum Lesen von Bytes-Daten aus einer SQL-Tabelle in ein File ''' </summary> ''' <param name="connection">die SQL-Connection</param> ''' <param name="theSelStr">der Selection-String für die gewünschte Zeile der Tabelle</param> ''' <param name="theFilePath">der komplette Filename (inkl. Laufwerk u. Pfad)</param> Public Sub databaseBytesToFile(connection As SqlConnection, theSelStr As String, theFilePath As String) Dim theIdval As String With theSelStr theIdval = .Substring(.IndexOf("'") + 1, .Length - .IndexOf("'") - 2) End With Using sqlQuery = New SqlCommand(theSelStr, connection) sqlQuery.Parameters.AddWithValue("@IDval", theIdval) connection.Open() Using sqlQueryResult = sqlQuery.ExecuteReader() If sqlQueryResult IsNot Nothing Then sqlQueryResult.Read() Dim blob = New Byte((sqlQueryResult.GetBytes(0, 0, Nothing, 0, Integer.MaxValue)) - 1) {} sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length) Using fs = New FileStream(theFilePath, FileMode.Create, FileAccess.Write) fs.Write(blob, 0, blob.Length) fs.Dispose() End Using End If End Using connection.Close() sqlQuery.Dispose() End Using End Sub
(In meinem Falle speichere ich die Audio-Daten in einem temporären File damit ich sie auch abspielen kann.)