首页 >后端开发 >C++ >将文件作为字节数组存储在数据库中是不同文件类型的最佳方法吗?

将文件作为字节数组存储在数据库中是不同文件类型的最佳方法吗?

Barbara Streisand
Barbara Streisand原创
2025-01-15 11:31:44112浏览

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

最佳数据库文件存储方式:将文件转换为字节数组?

问题:

将所有文件格式转换为字节数组,是否为数据库或磁盘存储的最佳方案?尤其是在处理GIF、DOC或PDF等多种文件类型时,这种方法是否最佳?

答案:

假设目标数据库是SQL Server,此方案可有效处理SQL Server 2005和2008。以下步骤概述了该过程:

  1. 创建数据库表: 创建一个表,其中包含一个用于存储二进制数据的VARBINARY(MAX)列。在本例中,创建一个名为“Raporty”的表,其中包含一个名为“RaportPlik”的VARBINARY(MAX)类型列。

  2. 将文件保存到数据库的方法:

    <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>
  3. 从数据库检索和保存文件的方法:

    <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>
  4. 将文件作为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>
  5. 将MemoryStream保存到数据库的方法:

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

通过这些方法,您可以有效地在SQL Server数据库中存储和检索各种格式的文件。此方法为管理二进制数据提供了一种简单可靠的解决方案。

以上是将文件作为字节数组存储在数据库中是不同文件类型的最佳方法吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn