Heim >Backend-Entwicklung >C++ >Ist das Speichern von Dateien als Byte-Arrays in einer Datenbank der optimale Ansatz für verschiedene Dateitypen?

Ist das Speichern von Dateien als Byte-Arrays in einer Datenbank der optimale Ansatz für verschiedene Dateitypen?

Barbara Streisand
Barbara StreisandOriginal
2025-01-15 11:31:44112Durchsuche

Is Storing Files as Byte Arrays in a Database the Optimal Approach for Diverse File Types?

Beste Möglichkeit, Datenbankdateien zu speichern: Datei in Byte-Array konvertieren?

Frage:

Ist die Konvertierung aller Dateiformate in Byte-Arrays die beste Lösung für Datenbank- oder Festplattenspeicher? Ist dieser Ansatz der beste, insbesondere wenn es um mehrere Dateitypen wie GIF, DOC oder PDF geht?

Antwort:

Angenommen, die Zieldatenbank ist SQL Server, kann diese Lösung SQL Server 2005 und 2008 effektiv verarbeiten. Die folgenden Schritte beschreiben den Prozess:

  1. Datenbanktabelle erstellen: Erstellen Sie eine Tabelle mit einer VARBINARY(MAX)-Spalte zum Speichern von Binärdaten. Erstellen Sie in diesem Beispiel eine Tabelle mit dem Namen „Raporty“, die eine Spalte vom Typ VARBINARY(MAX) mit dem Namen „RaportPlik“ enthält.

  2. Methode zum Speichern von Dateien in der Datenbank:

    <code class="language-csharp">public static void databaseFilePut(string varFilePath) {
        byte[] file;
        using (var stream = new FileStream(varFilePath, FileMode.Open, FileAccess.Read)) {
            using (var reader = new BinaryReader(stream)) {
                file = reader.ReadBytes((int) stream.Length);       
            }          
        }
        using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
        using (var sqlWrite = new SqlCommand("INSERT INTO Raporty (RaportPlik) Values(@File)", varConnection)) {
            sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;
            sqlWrite.ExecuteNonQuery();
        }
    }</code>
  3. Methoden zum Abrufen und Speichern von Dateien aus der Datenbank:

    <code class="language-csharp">public static void databaseFileRead(string varID, string varPathToNewLocation) {
        using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
        using (var sqlQuery = new SqlCommand(@"SELECT [RaportPlik] FROM [dbo].[Raporty] WHERE [RaportID] = @varID", varConnection)) {
            sqlQuery.Parameters.AddWithValue("@varID", varID);
            using (var sqlQueryResult = sqlQuery.ExecuteReader())
                if (sqlQueryResult != null) {
                    sqlQueryResult.Read();
                    var blob = new Byte[(sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue))];
                    sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length);
                    using (var fs = new FileStream(varPathToNewLocation, FileMode.Create, FileAccess.Write)) 
                        fs.Write(blob, 0, blob.Length);
                }
        }
    }</code>
  4. Methode zum Abrufen der Datei als MemoryStream:

    <code class="language-csharp">public static MemoryStream databaseFileRead(string varID) {
        MemoryStream memoryStream = new MemoryStream();
        using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
        using (var sqlQuery = new SqlCommand(@"SELECT [RaportPlik] FROM [dbo].[Raporty] WHERE [RaportID] = @varID", varConnection)) {
            sqlQuery.Parameters.AddWithValue("@varID", varID);
            using (var sqlQueryResult = sqlQuery.ExecuteReader())
                if (sqlQueryResult != null) {
                    sqlQueryResult.Read();
                    var blob = new Byte[(sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue))];
                    sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length);
                    memoryStream.Write(blob, 0, blob.Length);
                }
        }
        return memoryStream;
    }</code>
  5. Methode zum Speichern von MemoryStream in der Datenbank:

    <code class="language-csharp">public static int databaseFilePut(MemoryStream fileToPut) {
        int varID = 0;
        byte[] file = fileToPut.ToArray();
        const string preparedCommand = @"
                    INSERT INTO [dbo].[Raporty]
                                ([RaportPlik])
                          VALUES
                                (@File)
                      SELECT [RaportID] FROM [dbo].[Raporty]
          WHERE [RaportID] = SCOPE_IDENTITY()
                    ";
        using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
        using (var sqlWrite = new SqlCommand(preparedCommand, varConnection)) {
            sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;
    
            using (var sqlWriteQuery = sqlWrite.ExecuteReader())
                while (sqlWriteQuery != null && sqlWriteQuery.Read()) {
                    varID = sqlWriteQuery["RaportID"] is int ? (int) sqlWriteQuery["RaportID"] : 0;
                }
        }
        return varID;
    }</code>

Mit diesen Methoden können Sie Dateien verschiedener Formate effizient in der SQL Server-Datenbank speichern und abrufen. Diese Methode bietet eine einfache und zuverlässige Lösung für die Verwaltung binärer Daten.

Das obige ist der detaillierte Inhalt vonIst das Speichern von Dateien als Byte-Arrays in einer Datenbank der optimale Ansatz für verschiedene Dateitypen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn