首頁 > 後端開發 > C++ > 將檔案轉換為位元組數組是資料庫儲存的最佳解決方案嗎?

將檔案轉換為位元組數組是資料庫儲存的最佳解決方案嗎?

Patricia Arquette
發布: 2025-01-15 08:56:44
原創
636 人瀏覽過

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

將檔案轉換為位元組數組:資料庫儲存的最佳方案?

問題

將檔案儲存到資料庫或磁碟中,需要考慮最有效且可靠的方法。一種方法是在儲存檔案之前將其轉換為位元組數組。本文探討將檔案轉換為位元組陣列是否為儲存任何檔案格式的最佳策略。

解釋

將檔案轉換為位元組數組以進行資料庫儲存的適用性取決於所使用的特定資料庫。例如,在 SQL Server 中,使用 VARBINARY(MAX) 列建立表允許有效儲存位元組數組。

以下 C# 程式碼示範如何將檔案從磁碟機儲存到資料庫:

<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>
登入後複製

要檢索檔案並將其儲存到磁碟機:

<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>
登入後複製

此方法允許將檔案作為記憶體流檢索:

<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>
登入後複製

最後,將記憶體流插入資料庫:

<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 中使用合適的 VARBINARY(MAX) 列。提供的程式碼範例為資料庫中二進位檔案的讀寫操作提供了全面的實現,確保了檔案的可靠持久性和檢索。

以上是將檔案轉換為位元組數組是資料庫儲存的最佳解決方案嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板