Freigeben über


FILESTREAM-Daten in SQL Server 2008 (ADO.NET)

Mit SQL Server 2008 wird das FILESTREAM-Speicherattribut für in einer varbinary(max)-Spalte gespeicherte Binärdaten (BLOB) eingeführt. In SQL Server bestand von je her die Möglichkeit, Binärdaten zu speichern. Das Arbeiten mit diesen Daten erforderte jedoch ein spezielles Vorgehen. Unstrukturierte Daten wie z. B. Textdokumente, Bilder und Videos werden häufig außerhalb der Datenbank gespeichert und sind daher schwieriger zu verwalten.

HinweisHinweis

Sie müssen .NET Framework 3.5 SP1 (oder höher) installieren, um mithilfe von SqlClient mit FILESTREAM-Daten zu arbeiten.

Wenn das FILESTREAM-Attribut für eine varbinary(max)-Spalte festgelegt ist, werden die Daten von SQL Server im lokalen NTFS-Dateisystem und nicht in der Datenbankdatei gespeichert. Obwohl die Speicherung separat erfolgt, können dieselben Transact-SQL-Anweisungen verwendet werden, die für das Arbeiten mit in der Datenbank gespeicherten varbinary(max)-Daten unterstützt werden.

SqlClient-Unterstützung für FILESTREAM

Der .NET-Datenanbieter für SQL Server, System.Data.SqlClient, unterstützt das Lesen und Schreiben von FILESTREAM-Daten mithilfe der im System.Data.SqlTypes-Namespace definierten SqlFileStream-Klasse. SqlFileStream erbt von der System.IO.Stream-Klasse, die Methoden zum Lesen und Schreiben der Datenströme bereitstellt. Beim Lesen aus einem Strom werden die Daten vom Strom in eine Datenstruktur übertragen, z. B. in ein Bytearray. Beim Schreiben werden die Daten von einer Datenstruktur in einen Strom übertragen.

Erstellen der SQL Server-Tabelle

Mit den folgenden Transact-SQL-Anweisungen wird eine Tabelle mit dem Namen "employees" erstellt und eine Datenzeile eingefügt. Wenn die FILESTREAM-Speicherung aktiviert wurde, kann diese Tabelle gemeinsam mit den folgenden Codebeispielen verwendet werden. Die Links zu den Ressourcen in der SQL Server 2008-Onlinedokumentation finden Sie am Ende dieses Themas.

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

Beispiel für das Lesen von FILESTREAM-Daten

Im folgenden Codefragment wird veranschaulicht, wie Daten von einem FILESTREAM gelesen werden. Der Code ruft den logischen Pfad der Datei ab, wobei FileAccess auf Read und FileOptions auf SequentialScan gesetzt wird. Anschließend liest der Code die Bytes vom SqlFileStream in den Puffer. Die Bytes werden ins Konsolenfenster geschrieben.

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();
}

Beispiel für das Überschreiben von FILESTREAM-Daten

Im folgenden Codefragment wird veranschaulicht, wie Daten in einen FILESTREAM geschrieben werden, wobei alle vorhandenen Daten überschrieben werden. Der Code ruft den logischen Pfad der Datei ab und erstellt den SqlFileStream, wobei FileAccess auf Write und FileOptions auf SequentialScan gesetzt werden. Ein einzelnes Byte wird in den SqlFileStream geschrieben und ersetzt alle Daten in der Datei.

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();
}

Beispiel für das Einfügen von FILESTREAM-Daten

Im folgenden Beispiel wird dargestellt, wie Daten unter Verwendung der "Seek"-Methode in einen FILESTREAM geschrieben werden, wobei die Daten ans Ende der Datei angehängt werden. Der Code ruft den logischen Pfad der Datei ab und erstellt den SqlFileStream, wobei FileAccess auf ReadWrite und FileOptions auf SequentialScan gesetzt werden. Der Code verwendet die "Seek"-Methode, um das Ende der Datei zu suchen und an die vorhandene Datei ein einzelnes Byte anzuhängen.

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();
}

Ressourcen in der SQL Server-Onlinedokumentation.

Die vollständige Dokumentation für FILESTREAM finden Sie in den folgenden Abschnitten der SQL Server 2008-Onlinedokumentation.

Thema

Beschreibung

Entwerfen und Implementieren der FILESTREAM-Speicherung

Stellt Links zur FILESTREAM-Dokumentation und verwandten Themen bereit.

Übersicht über FILESTREAM

Beschreibt, in welchen Fällen die FILESTREAM-Speicherung verwendet werden sollte und wie diese das SQL Server-Datenbankmodul mit einem NTFS-Dateisystem integriert.

Erste Schritte mit FILESTREAM-Speicherung

Beschreibt, wie FILESTREAM für eine Instanz von SQL Server aktiviert wird, wie eine Datenbank und eine Tabelle zum Speichern von FILESTREAM-Daten erstellt werden und wie Zeilen mit FILESTREAM-Daten bearbeitet werden.

Verwenden der FILESTREAM-Speicherung in Clientanwendungen

Beschreibt die Win32 API-Funktionen zum Arbeiten mit FILESTREAM-Daten.

FILESTREAM und andere SQL Server-Funktionen

Enthält Überlegungen, Richtlinien und Einschränkungen zur Verwendung von FILESTREAM-Daten mit anderen Funktionen von SQL Server.

Siehe auch

Konzepte

Codezugriffssicherheit und ADO.NET

Weitere Ressourcen

SQL Server-Datentypen und ADO.NET

Abrufen und Ändern von Daten in ADO.NET

Binäre Daten und Daten mit umfangreichen Werten in SQL Server (ADO.NET)