piątek, 19 marca 2010

Pliki BLOB w MS SQL

Przechowywanie plików binarnych w bazie danych nie jest spotyka często. Przeważnie tworzy się pole służące do adresu pod którym można znaleźć żądany plik a sam plik jest umieszczany na dysku poza bazą. Główną przyczyną takiego faktu jest szybko rosnący rozmiar bazy danych. Aby przechować jakikolwiek plik w bazie danych np. grafikę czy plik excela, należy ten plik przekształcić do postaci binarnej i w takiej postaci zapisać. Przy odczycie z bazy danych odczytujemy postać binarną i zapisujemy ją jako żądany plik.

Przykładowo spróbujmy do bazy danych zapisać plik tekstowy. Baza danych składa się z jednej tabeli. Polami w tej tabeli są:
Plik tekstowy zawiera jedno zdanie: "Ala ma kota". Warto zauważyć że wartość pola varbinary można ustawić także na wartość max co pozwoli nam na przechowywanie plików do 2GB.

Kod pozwalający na zapis do bazy danych pliku:

        private void button1_Click(object sender, EventArgs e)
        {
            byte[] file;
            using (FileStream fs = new FileStream(@"d:\plik.txt", FileMode.Open, FileAccess.Read))
            {
                file = new byte[fs.Length];
                fs.Read(file, 0, (int)fs.Length);
            }
            using (SqlConnection conn = new SqlConnection(@"Data Source=ACER5738\sqlexpress;Initial Catalog=test;Integrated Security=True"))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand("INSERT INTO t1(data) VALUES(@binaryData)", conn))
                {
                    cmd.Parameters.Add(new SqlParameter("@binaryData", file));
                    cmd.ExecuteNonQuery();
                }
            }
        }

Odczyt z bazy danych jest bardzo podobny. Zapisując pole jako ciąg bajtów musimy je też w taki sam sposób odczytać:

        private void button2_Click(object sender, EventArgs e)
        {
            byte[] file;
            using (SqlConnection conn = new SqlConnection(@"Data Source=ACER5738\sqlexpress;Initial Catalog=test;Integrated Security=True"))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand("SELECT TOP 1 data FROM t1", conn))
                {
                    file = (byte[])cmd.ExecuteScalar();
                }
            }
            using (FileStream fs = new FileStream(@"d:\kopia.txt", FileMode.Create, FileAccess.Write))
            {
                fs.Write(file, 0, file.Length);
            }
        }

Brak komentarzy:

Prześlij komentarz