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 ?
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.
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>
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>
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>
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>
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!