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 저장소가 SQL Server 데이터베이스 엔진을 NTFS 파일 시스템과 통합하는 방법에 대해 설명합니다. |
|
SQL Server 인스턴스에서 FILESTREAM을 사용하도록 설정하는 방법, 저장된 FILESTREAM 데이터에 데이터베이스와 테이블을 만드는 방법 및 FILESTREAM 데이터가 포함된 행을 조작하는 방법에 대해 설명합니다. |
|
FILESTREAM 데이터로 작업하기 위한 Win32 API 함수에 대해 설명합니다. |
|
SQL Server의 다른 기능과 함께 FILESTREAM 데이터를 사용할 경우의 고려 사항, 지침 및 제한 사항을 제공합니다. |