Menyimpan File dalam Database [C#.Net]

FILE DALAM DATABASE

Menuliskan file ke dalam database masih banyak diperdebatkan keuntungan dan kerugiannya. Ada yang beragumentasi bahwa dengan menyimpan file ke dalam database maka akan membuat ukuran database menjadi besar, dan akan sulit untuk memaintain isi file bila memerlukan perubahan atau bagaimana penanganannya bila file tersebut tidak lagi digunakan. Alternatif yang bisa dipilih adalah menggabungkan keduanya yaitu mengkopikan file ke file server dan menuliskan path dan nama file ke dalam database.

Namun di luar dari yang diperdebatkan di atas, menuliskan file ke dalam database secara teknis adalah dimungkinkan. Itulah yang akan dibahas di bawah ini.

5.1 CLASS YANG TERLIBAT

System.Net.FileStream

Class ini mengekspos Stream pada file agar bisa digunakan untuk sinkronos dan asinkronos penulisan dan pembacaan file. Properti dan metode yang akan digunakan ditampilkan di tabel berikut ini.

Nama Metode

Keterangan

FileStream

Menginisialisasi obyek WebRequest dengan memberikan path file yang dituju, mode membuat atau membuka, dan ijin yang diberikan.

Close

Menutup stream yang digunakan dan melepaskan sumber daya yang digunakan oleh stream tersebut.

Write

Menuliskan blok byte dari buffer ke dalam stream.

System.IO.BinaryReader

Class ini membaca tipe data primitif sebagai nilai binari. Properti dan metode yang akan digunakan ditampilkan di tabel berikut ini.

Nama Metode

Keterangan

BinaryReader

Menginisialisasi instance baru dari BinaryReader.

ReadBytes

Membaca bytes dari stream yang ada ke dalam array byte.

5.2 MASALAH

Dalam beberapa kondisi penyimpanan file dipilih juga ke dalam database bukan ke file server. Jadi disediakan satu field dalam tabel untuk menyimpan suatu file. Biasanya tipe data field untuk keperluan penyimpanan file adalah binary. Keuntungan dari penyimpanan di dalam database adalah pemaksaan pada adanya hanya satu sumber file yang dijadikan referensi.

Staf IT Joseph diminta untuk menyiapkan sistem dasar yang bisa digunakan untuk menyimpan file resep ke dalam database untuk nantinya sistem ini akan dipelajari kelebihan dan kekurangannya dibandingkan dengan yang sekarang dipakai yaitu sistem file. Ingin disimpan file resep dengan nama filenya.

5.3 DISAIN

Use Case Menyimpan Isi File Resep ke dalam Database

  1. Nama Use Case:

Menyimpan Isi File Resep ke dalam Database

  1. Deskripsi Singkat:

Use case ini menerangkan mekanisme penyimpanan isi file resep ke dalam database.

  1. Basic Flow:

a. Pengguna membuka aplikasi.

b. Sistem menampilkan form aplikasi.

c. Pengguna memasukkan nama file resep yang akan disimpan, dan menekan tombol Simpan File.

d. Sistem menyimpan isi file tersebut ke dalam database.

e. Sistem menampilkan pesan transaksi berhasil.

  1. Alternate Flow:

a. Bila file yang dimaksud tidak ada di folder tujuan maka ditampilkan pesan bila file tidak ada.

b. Bila nama resep yang sama telah ada di database maka ditampilkan pesan bahwa nama resep sudah ada di database, dan apakah akan diupdate atau tidak, bila pengguna setuju untuk diupdate maka lanjutkan dengan use case Merubah Isi File Resep.

  1. Special Requirement:
  2. Pre-Condition:
  3. Post-Condition:

Use Case Membuat File Resep dari Database

  1. Nama Use Case:

Membuat File Resep dari Database

  1. Deskripsi Singkat:

Use case ini menerangkan mekanisme penulisan kembali isi file dalam database ke dalam bentuk file.

  1. Basic Flow:

a. Pengguna membuka aplikasi.

b. Sistem menampilkan form aplikasi.

c. Pengguna memasukkan nama file resep yang akan diambil, dan menekan tombol Ambil File.

d. Sistem mengambil isi file dan menuliskannya ke dalam bentuk file.

e. Sistem menampilkan pesan transaksi berhasil.

  1. Alternate Flow:

a. Bila file yang dimaksud sudah ada di folder tujuan maka ditampilkan pesan bila file sudah ada.

b. Bila nama resep tidak ditemukan di dalam database maka ditampilkan pesan bila resep tidak ada di dalam database.

  1. Special Requirement:
  2. Pre-Condition:
  3. Post-Condition:

5.4 IMPLEMENTASI

Di database SQL Server kita buat sebuah tabel bernama FileRecipe yang strukturnya terdiri dari 2 field yaitu:

tabel file

tabel file

Nama resep akan berisi nama resep seperti RotiKeju, sementara FileResep akan berisi file RotiKeju.txt.

Kita buat satu form bernama frmFileDatabase berisi 1 label, 1 textbox dan 2 tombol yaitu tombol Simpan File untuk menuliskan nama dan file resep ke dalam database, dan tombol Ambil File untuk membaca tabel FileRecipe dan mengembalikan isi file yang terambil ke dalam bentuk file text.

Di referensi kita tambahkan class untuk mengakses file dan juga untuk mengakses database SQL Server.

using System.Data.SqlClient;

using System.IO;

kita tambahkan variabel untuk menyimpan path dari file resep.

private string pathLocalResep = @”C:\MyResep\”;

kita mulai untuk menuliskan kode untuk menyimpan file ke dalam database. Klik ganda di tombol Simpan File.

Pertama-tama dilakukan perubahan file menjadi stream dan memasukkannya ke dalam array byte.

string fileName = pathLocalResep + txtResep.Text + “.txt”;

FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);

BinaryReader br = new BinaryReader(fs);

byte[] contents = br.ReadBytes(1000);

Isi file dalam variabel contents siap untuk dituliskan ke dalam database, kita buat dulu koneksi ke database SQL Server sebagai berikut:

SqlConnection con = new SqlConnection(“Data Source=DB-SQL;Initial Catalog=PabrikRoti;User ID=dbAdmin; Password=dbAdminPwd;”);

Nama database, nama user dan nama password bisa disesuaikan dengan nama lain yang dipergunakan di komputer anda.

Membuka database

con.Open();

Lalu persiapkan query yang akan dilakukan sebagai berikut:

SqlCommand insert = new SqlCommand(“insert into fileRecipe values(@resep,@contents)”, con);

SqlParameter conParameterResep = insert.Parameters.Add(“@resep”, SqlDbType.VarChar);

SqlParameter conParameterContent = insert.Parameters.Add(“@contents”, SqlDbType.Binary);

conParameterResep.Value = txtResep.Text;

conParameterContent.Value = contents;

conParameterContent.Size = contents.Length;

Dan siap dieksekusi.

insert.ExecuteNonQuery();

Jangan lupa untuk menutup koneksi ke database.

con.Close();

Kode untuk menuliskan file ke database lengkapnya sebagai berikut:

private void btnSimpan_Click(object sender, EventArgs e)

{

SqlConnection con = new SqlConnection(“Data Source=DB-SQL;Initial Catalog=PabrikRoti;User ID=dbAdmin; Password=dbAdminPwd;”);

try

{

string fileName = pathLocalResep + txtResep.Text + “.txt”;

FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);

BinaryReader br = new BinaryReader(fs);

byte[] contents = br.ReadBytes(1000);

con.Open();

SqlCommand insert = new SqlCommand(“insert into fileRecipe values(@resep,@contents)”, con);

SqlParameter conParameterResep = insert.Parameters.Add(“@resep”, SqlDbType.VarChar);

SqlParameter conParameterContent = insert.Parameters.Add(“@contents”, SqlDbType.Binary);

conParameterResep.Value = txtResep.Text;

conParameterContent.Value = contents;

conParameterContent.Size = contents.Length;

insert.ExecuteNonQuery();

MessageBox.Show(“Berhasil menuliskan file ke database”);

}

catch (Exception exc)

{

MessageBox.Show(“Gagal: “ + exc.Message);

}

finally

{

con.Close();

}

}

Sekarang beranjak ke kode untuk menuliskan kembali isi file dalam database ke dalam file semula. Klik ganda tombol Ambil File.

Pertama-tama kita akan baca dulu isi file yang mau diambil dari database. Lakukan koneksi ke database, dan buka koneksi tersebut.

SqlConnection con = new SqlConnection(“Data Source=DB-SQL;Initial Catalog=PabrikRoti;User ID=dbAdmin; Password=dbAdminPwd;”);

con.Open();

Kita siapkan query untuk mengambil file sesuai dengan input yang masuk.

SqlCommand insert = new SqlCommand(

“select fileresep from filerecipe where namaresep = ‘” + txtResep.Text + “‘”, con);

Eksekusi query.

SqlDataReader dr = insert.ExecuteReader();

Hasil eksekusi dr kemudian dibaca dan dipindahkan ke dalam variabel content.

dr.Read();

byte[] content = (byte[])dr[0];

Kita buat file untuk menampung isi file content ini dan tuliskan variabel content ke dalamnya, dan terakhir tutup filestream yang dibuat.

FileStream fs = new FileStream(pathLocalResep + txtResep.Text + “.txt”,

FileMode.CreateNew);

fs.Write(content, 0, content.Length);

fs.Close();

Jangan lupa untuk menutup koneksi database.

con.Close();

Kode selengkapnya dari menulis kembali isi file ke dalam file dan kode lengkap dari keseluruhan program yang dibuat disajikan di bawah ini.

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Data.SqlClient;

using System.IO;

namespace winAplikasiResep

{

public partial class frmFileDatabase : Form

{

private string pathLocalResep = @”C:\MyResep\”;

public frmFileDatabase()

{

InitializeComponent();

}

private void btnSimpan_Click(object sender, EventArgs e)

{

SqlConnection con = new SqlConnection(“Data Source=DB-SQL;Initial Catalog=PabrikRoti;User ID=dbAdmin; Password=dbAdminPwd;”);

try

{

string fileName = pathLocalResep + txtResep.Text + “.txt”;

FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);

BinaryReader br = new BinaryReader(fs);

byte[] contents = br.ReadBytes(1000);

con.Open();

SqlCommand insert = new SqlCommand(“insert into fileRecipe values(@resep,@contents)”, con);

SqlParameter conParameterResep = insert.Parameters.Add(“@resep”, SqlDbType.VarChar);

SqlParameter conParameterContent = insert.Parameters.Add(“@contents”, SqlDbType.Binary);

conParameterResep.Value = txtResep.Text;

conParameterContent.Value = contents;

conParameterContent.Size = contents.Length;

insert.ExecuteNonQuery();

MessageBox.Show(“Berhasil menuliskan file ke database”);

}

catch (Exception exc)

{

MessageBox.Show(“Gagal: “ + exc.Message);

}

finally

{

con.Close();

}

}

private void btnAmbil_Click(object sender, EventArgs e)

{

SqlConnection con = new SqlConnection(“Data Source=DB-SQL;Initial Catalog=PabrikRoti;User ID=dbAdmin; Password=dbAdminPwd;”);

con.Open();

try

{

SqlCommand insert = new SqlCommand(

“select fileresep from filerecipe where namaresep = ‘” + txtResep.Text + “‘”, con);

SqlDataReader dr = insert.ExecuteReader();

dr.Read();

byte[] content = (byte[])dr[0];

FileStream fs = new FileStream(pathLocalResep + txtResep.Text + “.txt”,

FileMode.CreateNew);

fs.Write(content, 0, content.Length);

fs.Close();

MessageBox.Show(“Berhasil membuat file dari database”);

}

catch (Exception exc)

{

MessageBox.Show(“Gagal: “ + exc.Message);

}

finally

{

con.Close();

}

}

}

}

Jalankan program dengan menggunakan tombol F5, tuliskan rotikeju di textbox Nama Resep, dan klik tombol Simpan File.

Akan ditampilkan message box berikut bila berhasil.

Cek ke dalam tabel FileRecipe dan lihat isinya, akan tampak seperti di bawah ini.

isi tabel

isi tabel

Sekarang giliran untuk mengembalikan apa yang ada di database ke dalam bentuk file semula. Tekan tombol Ambil File, dan bila berhasil maka akan ditampilkan message box seperti di bawah ini.

Cek ke dalam folder dimana file dibuat dan buka file tersebut untuk melihat apakah isinya sesuai dengan isi file semula atau tidak. Untuk mengecek apa yang terjadi bila error berlaku, coba klik lagi tombol Ambil File maka akan ditampilkan message box seperti ini.

Advertisements