Maison > développement back-end > C++ > Le stockage de fichiers sous forme de tableaux d'octets dans une base de données est-il l'approche optimale pour divers types de fichiers ?

Le stockage de fichiers sous forme de tableaux d'octets dans une base de données est-il l'approche optimale pour divers types de fichiers ?

Barbara Streisand
Libérer: 2025-01-15 11:31:44
original
111 Les gens l'ont consulté

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

Meilleure façon de stocker des fichiers de base de données : convertir un fichier en tableau d'octets ?

Question :

La conversion de tous les formats de fichiers en tableaux d'octets est-elle la meilleure solution pour le stockage sur base de données ou sur disque ? Cette approche est-elle la meilleure, en particulier lorsqu'il s'agit de plusieurs types de fichiers tels que GIF, DOC ou PDF ?

Réponse :

En supposant que la base de données cible est SQL Server, cette solution peut gérer efficacement SQL Server 2005 et 2008. Les étapes suivantes décrivent le processus :

  1. Créer une table de base de données : Créez une table avec une colonne VARBINARY(MAX) pour stocker les données binaires. Dans cet exemple, créez une table appelée « Raporty » qui contient une colonne de type VARBINARY(MAX) appelée « RaportPlik ».

  2. Méthode pour enregistrer les fichiers dans la 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
  3. Méthodes pour récupérer et enregistrer des fichiers de la base de données :

    <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
  4. Méthode pour récupérer un fichier en tant que 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>
    Copier après la connexion
  5. Méthode pour enregistrer MemoryStream 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

Avec ces méthodes, vous pouvez stocker et récupérer efficacement des fichiers de différents formats dans la base de données SQL Server. Cette méthode fournit une solution simple et fiable pour gérer les données binaires.

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