Rumah > pembangunan bahagian belakang > C++ > Adakah Menukar Fail kepada Tatasusunan Byte Penyelesaian Optimum untuk Penyimpanan Pangkalan Data?

Adakah Menukar Fail kepada Tatasusunan Byte Penyelesaian Optimum untuk Penyimpanan Pangkalan Data?

Patricia Arquette
Lepaskan: 2025-01-15 08:56:44
asal
633 orang telah melayarinya

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

Tukar fail kepada tatasusunan bait: penyelesaian terbaik untuk penyimpanan pangkalan data?

Soalan

Untuk menyimpan fail ke dalam pangkalan data atau cakera, pertimbangkan kaedah yang paling cekap dan boleh dipercayai. Satu cara ialah menukar fail kepada tatasusunan bait sebelum menyimpannya. Artikel ini meneroka sama ada menukar fail kepada tatasusunan bait ialah strategi terbaik untuk menyimpan sebarang format fail.

Penjelasan

Kesesuaian menukar fail kepada tatasusunan bait untuk storan pangkalan data bergantung pada pangkalan data khusus yang digunakan. Contohnya, dalam SQL Server, mencipta jadual menggunakan lajur VARBINARY(MAX) membolehkan penyimpanan tatasusunan bait yang cekap.

Kod C# berikut menunjukkan cara menyimpan fail daripada pemacu ke dalam pangkalan data:

<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>
Salin selepas log masuk

Untuk mendapatkan semula fail dan menyimpannya ke pemacu anda:

<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>
Salin selepas log masuk

Kaedah ini membenarkan fail diambil semula sebagai aliran memori:

<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>
Salin selepas log masuk

Akhir sekali, masukkan aliran memori ke dalam pangkalan data:

<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>
Salin selepas log masuk

Kesimpulan

Menukar fail kepada tatasusunan bait boleh menjadi cara yang cekap untuk menyimpan fail dari sebarang format dalam pangkalan data atau pada cakera dengan menggunakan lajur VARBINARY(MAX) yang sesuai dalam SQL Server. Contoh kod yang disediakan menyediakan pelaksanaan yang komprehensif untuk membaca dan menulis fail binari dalam pangkalan data, memastikan kegigihan yang boleh dipercayai dan mendapatkan semula fail.

Atas ialah kandungan terperinci Adakah Menukar Fail kepada Tatasusunan Byte Penyelesaian Optimum untuk Penyimpanan Pangkalan Data?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan