다음을 통해 공유


SQL Server 2008의 FILESTREAM 데이터(ADO.NET)

SQL Server 2008에서는 varbinary(max) 열에 저장된 이진(BLOB) 데이터에 대해 FILESTREAM 저장소 특성을 지원합니다. SQL Server에서는 이진 데이터 저장 기능을 항상 제공해 왔지만 이진 데이터는 특별하게 처리해야 했습니다. 텍스트 문서, 이미지 및 비디오 같이 구조화되지 않은 데이터는 대개 데이터베이스의 외부에 저장되어 관리가 어렵습니다.

참고참고

SqlClient에서 FILESTREAM 데이터로 작업하려면 .NET Framework 3.5 SP1 이상을 설치해야 합니다.

varbinary(max) 열에 FILESTREAM 특성을 지정하면 SQL Server에서는 데이터베이스 파일 대신 로컬 NTFS 파일 시스템에 데이터를 저장합니다. 별도로 데이터가 저장되지만 데이터베이스에 저장된 varbinary(max) 데이터로 작업할 때와 동일한 Transact-SQL 문을 사용할 수 있습니다.

FILESTREAM에 대한 SqlClient 지원

.NET Data Provider for SQL Server인 System.Data.SqlClient에서는 System.Data.SqlTypes 네임스페이스에 정의된 SqlFileStream 클래스를 사용하여 FILESTREAM 데이터에 대한 읽기와 쓰기를 지원합니다. SqlFileStream은 데이터 스트림에 대한 읽기 및 쓰기 메서드를 제공하는 System.IO.Stream 클래스에서 상속됩니다. 스트림에서 읽으면 바이트 배열과 같은 데이터가 스트림에서 데이터 구조로 전송되고, 데이터를 쓰면 데이터가 데이터 구조에서 스트림으로 전송됩니다.

SQL Server 테이블 만들기

다음 Transact-SQL 문은 employees라는 테이블을 만들어 데이터 행을 삽입합니다. FILESTREAM 저장소를 설정한 후에는 다음에 나오는 코드 예제와 함께 이 테이블을 사용할 수 있습니다. SQL Server 2008 온라인 설명서의 리소스 링크는 이 항목의 맨 마지막에 나옵니다.

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

FILESTREAM 데이터 읽기 예제

다음 코드 조각에서는 FILESTREAM에서 데이터를 읽는 방법을 보여 줍니다. 이 코드에서는 FileAccess를 Read로 설정하고 FileOptions를 SequentialScan으로 설정하여 파일의 논리 경로를 가져옵니다. 그런 다음 코드에서는 SqlFileStream의 바이트를 버퍼로 읽어오고 콘솔 창에 바이트를 씁니다.

using (SqlConnection connection = new SqlConnection(
    connStringBuilder.ToString()))
{
    connection.Open();
    SqlCommand command = new SqlCommand("", connection);

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

    command.CommandText = 
        "select Top(1) Photo.PathName(), " 
        + "GET_FILESTREAM_TRANSACTION_CONTEXT () from employees";
    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
            FileStream fileStream = new SqlFileStream(path,
            (byte[])reader.GetValue(1),
                FileAccess.Read,
                FileOptions.SequentialScan, 0);

            // Read the contents as bytes and write them to the console
            for (long index = 0; index < fileStream.Length; index++)
            {
                Console.Write(fileStream.ReadByte());
            }
            fileStream.Close();
        }
    }
    tran.Commit();
}

FILESTREAM 데이터 덮어쓰기 예제

다음 코드 조각에서는 FILESTREAM에 데이터를 써서 기존의 모든 데이터를 덮어쓰는 방법을 보여 줍니다. 이 코드에서는 FileAccess를 Write로 설정하고 FileOptions를 SequentialScan으로 설정하여 파일의 논리 경로를 가져오고 SqlFileStream을 만듭니다. 그런 다음 SqlFileStream에 단일 바이트를 써서 파일의 모든 데이터를 대체합니다.

using (SqlConnection connection = new SqlConnection(
    connStringBuilder.ToString()))
{
    connection.Open();

    SqlCommand command = new SqlCommand("", connection);
    command.CommandText = "select Top(1) Photo.PathName(), "
    + "GET_FILESTREAM_TRANSACTION_CONTEXT () from employees";

    SqlTransaction tran = connection.BeginTransaction(
        System.Data.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
            FileStream fileStream = new SqlFileStream(path,
                (byte[])reader.GetValue(1),
                FileAccess.Write,
                FileOptions.SequentialScan, 0);

            // Write a single byte to the file. This will
            // replace any data in the file.
            fileStream.WriteByte(0x01);

            fileStream.Close();
        }
    }
    tran.Commit();
}

FILESTREAM 데이터 삽입 예제

다음 예제에서는 Seek 메서드를 사용하여 파일 끝에 데이터를 추가하는 방법으로 FILESTREAM에 데이터를 쓰는 방법을 보여 줍니다. 이 코드에서는 FileAccess를 ReadWrite로 설정하고 FileOptions를 SequentialScan으로 설정하여 파일의 논리 경로를 가져오고 SqlFileStream을 만듭니다. 코드에서는 Seek 메서드를 사용하여 파일의 끝을 찾은 다음 기존 파일에 단일 바이트를 추가합니다.

using (SqlConnection connection = new SqlConnection(
    connStringBuilder.ToString()))
{
    connection.Open();

    SqlCommand command = new SqlCommand("", connection);
    command.CommandText = "select Top(1) Photo.PathName(), "
    + "GET_FILESTREAM_TRANSACTION_CONTEXT () from employees";

    SqlTransaction tran = connection.BeginTransaction(
        System.Data.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;

            FileStream fileStream = new SqlFileStream(path,
                (byte[])reader.GetValue(1),
                FileAccess.ReadWrite,
                FileOptions.SequentialScan, 0);

            // Seek to the end of the file
            fs.Seek(0, SeekOrigin.End);

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

SQL Server 온라인 설명서 리소스

FILESTREAM에 대한 자세한 설명은 SQL Server 2008 온라인 설명서의 다음 섹션에 나와 있습니다.

항목

설명

FILESTREAM 저장소 디자인 및 구현

FILESTREAM 문서 및 관련 항목에 대한 링크를 제공합니다.

FILESTREAM 개요

FILESTREAM 저장소를 사용해야 하는 경우 및 FILESTREAM 저장소가 SQL Server 데이터베이스 엔진을 NTFS 파일 시스템과 통합하는 방법에 대해 설명합니다.

FILESTREAM 저장소 시작

SQL Server 인스턴스에서 FILESTREAM을 사용하도록 설정하는 방법, 저장된 FILESTREAM 데이터에 데이터베이스와 테이블을 만드는 방법 및 FILESTREAM 데이터가 포함된 행을 조작하는 방법에 대해 설명합니다.

클라이언트 응용 프로그램에서 FILESTREAM 저장소 사용

FILESTREAM 데이터로 작업하기 위한 Win32 API 함수에 대해 설명합니다.

다른 SQL Server 기능과 함께 FILESTREAM 사용

SQL Server의 다른 기능과 함께 FILESTREAM 데이터를 사용할 경우의 고려 사항, 지침 및 제한 사항을 제공합니다.

참고 항목

개념

코드 액세스 보안 및 ADO.NET

기타 리소스

SQL Server 데이터 형식과 ADO.NET

ADO.NET에서 데이터 검색 및 수정

SQL Server 이진 데이터 및 큰 값 데이터(ADO.NET)