Bagikan melalui


Data FILESTREAM

Atribut penyimpanan FILESTREAM adalah untuk data biner (BLOB) yang disimpan dalam kolom varbinary(max). Sebelum FILESTREAM, menyimpan data biner membutuhkan penanganan khusus. Data yang tidak terstruktur, seperti dokumen teks, gambar dan video, sering disimpan di luar database, sehingga sulit untuk dikelola.

Catatan

Anda harus menginstal .NET Framework 3.5 SP1 (atau lebih baru) untuk bekerja dengan data FILESTREAM menggunakan SqlClient.

Menentukan atribut FILESTREAM pada kolom varbinary(max) menyebabkan SQL Server menyimpan data pada sistem file NTFS lokal, bukan dalam file database. Meskipun disimpan secara terpisah, Anda bisa menggunakan pernyataan Transact-SQL yang sama yang didukung untuk bekerja dengan data varbinary(max) yang disimpan dalam database.

Dukungan SqlClient untuk FILESTREAM

Penyedia Data .NET Framework untuk SQL Server, System.Data.SqlClient, mendukung membaca dan menulis ke data FILESTREAM menggunakan kelas SqlFileStream yang ditentukan dalam namespace System.Data.SqlTypes. SqlFileStream mewarisi dari kelas Stream, yang menyediakan metode untuk membaca dan menulis ke aliran data. Membaca dari aliran mentransfer data dari aliran ke dalam struktur data, seperti array byte. Menulis mentransfer data dari struktur data ke dalam aliran.

Membuat Tabel SQL Server

Pernyataan Transact-SQL berikut ini membuat tabel bernama karyawan dan menyisipkan deretan data. Setelah Mengaktifkan penyimpanan FILESTREAM, Anda bisa menggunakan tabel ini bersama dengan contoh kode yang mengikutinya.

CREATE TABLE employees
(
  EmployeeId INT  NOT NULL  PRIMARY KEY,
  Photo VARBINARY(MAX) FILESTREAM  NULL,
  RowGuid UNIQUEIDENTIFIER  NOT NULL  ROWGUIDCOL
  UNIQUE DEFAULT NEWID()
)
GO
Insert into employees
Values(1, 0x00, default)
GO

Contoh: Membaca, Menimpa, dan Menyisipkan Data FILESTREAM

Sampel berikut ini menunjukkan cara membaca data dari FILESTREAM. Kode mendapatkan jalur logis ke file, mengatur FileAccess ke Read dan FileOptions ke SequentialScan. Kode kemudian membaca byte dari SqlFileStream ke buffer. Byte kemudian ditulis ke jendela konsol.

Sampel juga menunjukkan cara menulis data ke FILESTREAM di mana semua data yang ada ditimpa. Kode mendapatkan jalur logis ke file dan membuat SqlFileStream, mengatur FileAccess ke Write dan FileOptions ke SequentialScan. Satu byte ditulis ke SqlFileStream, menggantikan data apa pun dalam file.

Sampel juga menunjukkan cara menulis data ke FILESTREAM dengan menggunakan metode Cari untuk menambahkan data ke akhir file. Kode mendapatkan jalur logis ke file dan membuat SqlFileStream, mengatur FileAccess ke ReadWrite dan FileOptions ke SequentialScan. Kode menggunakan metode Seek untuk mencari ke akhir file, menambahkan satu byte ke file yang ada.

using System;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Data;
using System.IO;

namespace FileStreamTest
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder("server=(local);integrated security=true;database=myDB");
            ReadFileStream(builder);
            OverwriteFileStream(builder);
            InsertFileStream(builder);

            Console.WriteLine("Done");
        }

        private static void ReadFileStream(SqlConnectionStringBuilder connStringBuilder)
        {
            using (SqlConnection connection = new SqlConnection(connStringBuilder.ToString()))
            {
                connection.Open();
                SqlCommand command = new SqlCommand("SELECT TOP(1) Photo.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM employees", connection);

                SqlTransaction tran = connection.BeginTransaction(IsolationLevel.ReadCommitted);
                command.Transaction = tran;

                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        // Get the pointer for the file
                        string path = reader.GetString(0);
                        byte[] transactionContext = reader.GetSqlBytes(1).Buffer;

                        // Create the SqlFileStream
                        using (Stream fileStream = new SqlFileStream(path, transactionContext, FileAccess.Read, FileOptions.SequentialScan, allocationSize: 0))
                        {
                            // Read the contents as bytes and write them to the console
                            for (long index = 0; index < fileStream.Length; index++)
                            {
                                Console.WriteLine(fileStream.ReadByte());
                            }
                        }
                    }
                }
                tran.Commit();
            }
        }

        private static void OverwriteFileStream(SqlConnectionStringBuilder connStringBuilder)
        {
            using (SqlConnection connection = new SqlConnection(connStringBuilder.ToString()))
            {
                connection.Open();

                SqlCommand command = new SqlCommand("SELECT TOP(1) Photo.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM employees", connection);

                SqlTransaction tran = connection.BeginTransaction(IsolationLevel.ReadCommitted);
                command.Transaction = tran;

                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        // Get the pointer for file
                        string path = reader.GetString(0);
                        byte[] transactionContext = reader.GetSqlBytes(1).Buffer;

                        // Create the SqlFileStream
                        using (Stream fileStream = new SqlFileStream(path, transactionContext, FileAccess.Write, FileOptions.SequentialScan, allocationSize: 0))
                        {
                            // Write a single byte to the file. This will
                            // replace any data in the file.
                            fileStream.WriteByte(0x01);
                        }
                    }
                }
                tran.Commit();
            }
        }

        private static void InsertFileStream(SqlConnectionStringBuilder connStringBuilder)
        {
            using (SqlConnection connection = new SqlConnection(connStringBuilder.ToString()))
            {
                connection.Open();

                SqlCommand command = new SqlCommand("SELECT TOP(1) Photo.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM employees", connection);

                SqlTransaction tran = connection.BeginTransaction(IsolationLevel.ReadCommitted);
                command.Transaction = tran;

                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        // Get the pointer for file
                        string path = reader.GetString(0);
                        byte[] transactionContext = reader.GetSqlBytes(1).Buffer;

                        using (Stream fileStream = new SqlFileStream(path, transactionContext, FileAccess.ReadWrite, FileOptions.SequentialScan, allocationSize: 0))
                        {
                            // Seek to the end of the file
                            fileStream.Seek(0, SeekOrigin.End);

                            // Append a single byte
                            fileStream.WriteByte(0x01);
                        }
                    }
                }
                tran.Commit();
            }

        }
    }
}

Untuk sampel lain, lihat Cara menyimpan dan mengambil data biner ke dalam kolom aliran file.

SQL Server sumber daya dokumen

Dokumentasi lengkap untuk FILESTREAM terletak di bagian berikut ini dari dokumen SQL Server.

Topik Deskripsi
FILESTREAM (SQL Server) Menjelaskan kapan harus menggunakan penyimpanan FILESTREAM dan bagaimana mengintegrasikan SQL Server 数据库引擎 dengan sistem file NTFS.
Membuat Aplikasi Klien untuk Data FILESTREAM Menjelaskan fungsi API Windows untuk bekerja dengan data FILESTREAM.
FILESTREAM dan Fitur SQL Server Lainnya Memberikan pertimbangan, pedoman, dan batasan untuk menggunakan data FILESTREAM dengan fitur SQL Server lainnya.

Lihat juga