Heim >Backend-Entwicklung >C++ >Ist die Konvertierung von Dateien in Byte-Arrays die optimale Lösung für die Datenbankspeicherung?

Ist die Konvertierung von Dateien in Byte-Arrays die optimale Lösung für die Datenbankspeicherung?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-15 08:56:44629Durchsuche

Is Converting Files to Byte Arrays the Optimal Solution for Database Storage?

Datei in Byte-Array konvertieren: beste Lösung für die Datenbankspeicherung?

Frage

Zum Speichern von Dateien in einer Datenbank oder auf einem Datenträger sollten Sie die effizienteste und zuverlässigste Methode in Betracht ziehen. Eine Möglichkeit besteht darin, die Datei vor dem Speichern in ein Byte-Array zu konvertieren. In diesem Artikel wird untersucht, ob die Konvertierung von Dateien in Byte-Arrays die beste Strategie zum Speichern beliebiger Dateiformate ist.

Erklärung

Die Eignung der Konvertierung einer Datei in ein Byte-Array für die Datenbankspeicherung hängt von der konkret verwendeten Datenbank ab. Beispielsweise ermöglicht das Erstellen von Tabellen mit VARBINARY(MAX)-Spalten in SQL Server eine effiziente Speicherung von Byte-Arrays.

Der folgende C#-Code zeigt, wie eine Datei von einem Laufwerk in einer Datenbank gespeichert wird:

<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>

So rufen Sie eine Datei ab und speichern sie auf Ihrem Laufwerk:

<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>

Mit dieser Methode kann die Datei als Speicherstream abgerufen werden:

<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>

Zum Schluss fügen Sie den Speicherstream in die Datenbank ein:

<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>

Fazit

Das Konvertieren einer Datei in ein Byte-Array kann eine effiziente Möglichkeit sein, Dateien beliebigen Formats in einer Datenbank oder auf der Festplatte zu speichern, indem geeignete VARBINARY(MAX) Spalten in SQL Server verwendet werden. Die bereitgestellten Codebeispiele bieten eine umfassende Implementierung zum Lesen und Schreiben von Binärdateien in der Datenbank und gewährleisten so eine zuverlässige Persistenz und einen zuverlässigen Abruf von Dateien.

Das obige ist der detaillierte Inhalt vonIst die Konvertierung von Dateien in Byte-Arrays die optimale Lösung für die Datenbankspeicherung?. 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