Partager via


Données FILESTREAM dans SQL Server 2008 (ADO.NET)

Mise à jour : November 2007

SQL Server 2008 introduit l'attribut de stockage FILESTREAM pour les données binaires (BLOB) stockées dans une colonne varbinary(max). SQL Server a toujours permis de stocker des données binaires, mais leur utilisation nécessitait une manipulation particulière. Les données non structurées, telles que les documents texte, les images et les vidéos, sont souvent stockées en dehors de la base de données, ce qui rend difficile leur gestion.

Remarque :

Vous devez installer le .NET Framework 3.5 SP1 (ou version ultérieure) pour utiliser les données FILESTREAM avec SqlClient.

Si vous spécifiez l'attribut FILESTREAM sur une colonne varbinary(max), SQL Server stocke les données sur le système de fichiers NTFS local au lieu du fichier de base de données. Même si elles sont stockées séparément, vous pouvez utiliser les mêmes instructions Transact-SQL prises en charge pour l'utilisation des données varbinary(max) stockées dans la base.

Prise en charge de SqlClient pour FILESTREAM

Le fournisseur de données .NET pour SQL Server, System.Data.SqlClient, prend en charge la lecture et l'écriture vers les données FILESTREAM en utilisant la classe SqlFileStream définie dans l'espace de noms System.Data.SqlTypes. SqlFileStream hérite de la classe System.IO.Stream, qui fournit les méthodes permettant de lire et d'écrire vers les flux de données. La lecture à partir d'un flux transfère les données du flux dans une structure de données, tel qu'un tableau d'octets. L'écriture transfère les données de la structure dans un flux.

Création de la table SQL Server

L'instruction Transact-SQL suivante crée une table nommée employees et y insère une ligne de données. Après avoir activé le stockage FILESTREAM, vous pouvez combiner cette table aux exemples de code suivants. Les liens vers les ressources dans la documentation en ligne de SQL Server 2008 figurent à la fin de cette rubrique.

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

Exemple de lecture de données FILESTREAM

Le fragment de code suivant montre comment lire les données à partir d'un fichier FILESTREAM. Le code obtient le chemin d'accès logique au fichier, en affectant la valeur Read à FileAccess et la valeur SequentialScan à FileOptions. Puis le code lit les octets à partir du SqlFileStream dans la mémoire tampon. Les octets s'affichent ensuite dans la fenêtre de console.

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

Exemple de remplacement de données FILESTREAM

Le fragment de code suivant montre comment écrire des données dans un fichier FILESTREAM dans lequel toutes les données existantes sont remplacées. Le code obtient le chemin d'accès logique au fichier et crée le SqlFileStream, en affectant la valeur Write à FileAccess et la valeur SequentialScan à FileOptions. Un seul octet est écrit dans le SqlFileStream, remplaçant ainsi les données du fichier.

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

Exemple d'insertion de données FILESTREAM

L'exemple suivant montre comment écrire des données dans un fichier FILESTREAM en utilisant la méthode Seek pour ajouter des données à la fin du fichier. Le code obtient le chemin d'accès logique au fichier et crée le SqlFileStream, en affectant la valeur ReadWrite à FileAccess et la valeur SequentialScan à FileOptions. Le code utilise la méthode Seek pour ajouter un seul octet à la fin du fichier existant.

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

Ressources dans la documentation en ligne de SQL Server.

La documentation complète relative à FILESTREAM se trouve dans les sections suivantes de la documentation en ligne de SQL Server 2008.

Rubrique

Description

Conception et implémentation du stockage FILESTREAM

Fournit des liens vers la documentation relative à FILESTREAM et les rubriques connexes.

Vue d'ensemble de FILESTREAM

Explique quand utiliser le stockage FILESTREAM et comment il intègre le moteur de base de données SQL Server avec un système de fichiers NTFS.

Mise en route du stockage FILESTREAM

Explique comment activer FILESTREAM sur une instance de SQL Server, comment créer une base de données et une table pour stocker les données FILESTREAM, et comment manipuler les lignes contenant des données FILESTREAM.

Utilisation du stockage FILESTREAM dans des applications clientes

Décrit les fonctions API Win32 pour une utilisation avec des données FILESTREAM.

Utilisation de FILESTREAM avec d'autres fonctionnalités SQL Server

Fournit des considérations, indications et limitations relatives à l'utilisation des données FILESTREAM avec d'autres fonctionnalités de SQL Server.

Voir aussi

Concepts

Sécurité d'accès du code et ADO.NET

Autres ressources

Types de données SQL Server et ADO.NET

Extraction et modification de données dans ADO.NET

Données binaires et de valeur élevée SQL Server (ADO.NET)