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