Maison > développement back-end > C++ > La conversion de fichiers en tableaux d'octets est-elle la solution optimale pour le stockage de bases de données ?

La conversion de fichiers en tableaux d'octets est-elle la solution optimale pour le stockage de bases de données ?

Patricia Arquette
Libérer: 2025-01-15 08:56:44
original
635 Les gens l'ont consulté

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

Convertir un fichier en tableau d'octets : la meilleure solution pour le stockage de base de données ?

Question

Pour stocker des fichiers dans une base de données ou un disque, considérez la méthode la plus efficace et la plus fiable. Une solution consiste à convertir le fichier en tableau d’octets avant de l’enregistrer. Cet article explore si la conversion de fichiers en tableaux d'octets est la meilleure stratégie pour stocker n'importe quel format de fichier.

Explication

L'adéquation de la conversion d'un fichier en tableau d'octets pour le stockage de base de données dépend de la base de données spécifique utilisée. Par exemple, dans SQL Server, la création de tables utilisant des colonnes VARBINARY(MAX) permet un stockage efficace des tableaux d'octets.

Le code C# suivant montre comment stocker un fichier d'un lecteur dans une base de données :

<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>
Copier après la connexion

Pour récupérer un fichier et l'enregistrer sur votre disque :

<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>
Copier après la connexion

Cette méthode permet de récupérer le fichier sous forme de flux mémoire :

<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>
Copier après la connexion

Enfin, insérez le flux mémoire dans la base de données :

<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>
Copier après la connexion

Conclusion

La conversion d'un fichier en tableau d'octets peut être un moyen efficace de stocker des fichiers de n'importe quel format dans une base de données ou sur disque en utilisant des colonnes VARBINARY(MAX) appropriées dans SQL Server. Les exemples de code fournis fournissent une implémentation complète pour la lecture et l'écriture de fichiers binaires dans la base de données, garantissant une persistance et une récupération fiables des fichiers.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal