Maison > développement back-end > C++ > Le stockage de fichiers sous forme de tableaux d'octets dans une base de données est-il la méthode la plus efficace ?

Le stockage de fichiers sous forme de tableaux d'octets dans une base de données est-il la méthode la plus efficace ?

Susan Sarandon
Libérer: 2025-01-15 09:31:48
original
544 Les gens l'ont consulté

Is Storing Files as Byte Arrays in a Database the Most Efficient Method?

Stockez des fichiers de n'importe quel format dans la base de données sous forme de tableaux d'octets

L'enregistrement de fichiers dans différents formats sur une base de données ou un disque nécessite une attention particulière. Une approche courante consiste à convertir le fichier en tableau d'octets avant de le stocker. Cette méthode permet de stocker des fichiers de n’importe quel format, mais elle soulève la question de savoir si c’est la meilleure méthode.

Pour illustrer ce processus, considérez l'extrait de code suivant fourni dans la réponse :

Insérer le fichier sous forme de tableau d'octets dans la base de données SQL Server :

<code class="language-c#">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

Récupérer le fichier de la base de données sous forme de tableau d'octets :

<code class="language-c#">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();
                byte[] blob = new byte[(int)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

Utilisez MemoryStream pour insérer le fichier dans la base de données sous forme de tableau d'octets :

<code class="language-c#">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

Ces extraits de code démontrent le processus de conversion d'un fichier en tableau d'octets, puis de son stockage dans une colonne de base de données de type VARBINARY(MAX). Si nécessaire, le fichier peut être récupéré sous forme de tableau d'octets et enregistré en tant que nouveau fichier ou diffusé vers une application.

Le texte fourni est déjà assez concis et bien écrit. La principale modification apportée est de corriger un problème mineur dans la fonction databaseFileRead où la longueur du tableau d'octets n'était pas correctement convertie en un entier avant l'allocation. ont été jugés nécessaires pour une paraphrase efficace tout en conservant le sens et la structure d'origine.

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