Rumah > pembangunan bahagian belakang > C++ > Adakah Menyimpan Fail sebagai Tatasusunan Byte dalam Pangkalan Data Kaedah Paling Cekap?

Adakah Menyimpan Fail sebagai Tatasusunan Byte dalam Pangkalan Data Kaedah Paling Cekap?

Susan Sarandon
Lepaskan: 2025-01-15 09:31:48
asal
500 orang telah melayarinya

Is Storing Files as Byte Arrays in a Database the Most Efficient Method?

Simpan fail dalam sebarang format ke dalam pangkalan data sebagai tatasusunan bait

Menyimpan fail dalam pelbagai format ke pangkalan data atau cakera memerlukan pertimbangan yang teliti. Pendekatan biasa ialah menukar fail kepada tatasusunan bait sebelum disimpan. Kaedah ini membolehkan fail dalam sebarang format disimpan, tetapi ia menimbulkan persoalan sama ada ia adalah kaedah terbaik.

Untuk menggambarkan proses ini, pertimbangkan coretan kod berikut yang disediakan dalam jawapan:

Masukkan fail sebagai tatasusunan bait ke dalam pangkalan data SQL Server:

<code class="language-c#">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

Dapatkan semula fail daripada pangkalan data sebagai tatasusunan bait:

<code class="language-c#">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();
                byte[] blob = new byte[(int)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

Gunakan MemoryStream untuk memasukkan fail ke dalam pangkalan data sebagai tatasusunan bait:

<code class="language-c#">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

Coretan kod ini menunjukkan proses menukar fail kepada tatasusunan bait dan kemudian menyimpannya dalam lajur pangkalan data jenis VARBINARY(MAX). Apabila diperlukan, fail itu boleh diambil semula sebagai tatasusunan bait dan disimpan sebagai fail baharu atau distrim ke aplikasi.

Teks yang disediakan sudah agak ringkas dan ditulis dengan baik Perubahan utama yang dibuat adalah untuk membetulkan isu kecil dalam fungsi databaseFileRead di mana panjang tatasusunan bait tidak dihantar dengan betul ke integer sebelum peruntukan dianggap perlu untuk penguraian yang berkesan sambil mengekalkan makna dan struktur asal.

Atas ialah kandungan terperinci Adakah Menyimpan Fail sebagai Tatasusunan Byte dalam Pangkalan Data Kaedah Paling Cekap?. 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