Datos FILESTREAM de SQL Server 2008 (ADO.NET)

SQL Server 2008 incorpora el atributo de almacenamiento FILESTREAM para los datos binarios (BLOB) almacenados en una columna varbinary(max). SQL Server ha proporcionado siempre la capacidad para almacenar datos binarios, pero trabajar con estos ha requerido un tratamiento especial. Los datos no estructurados, como los documentos de texto, imágenes y vídeo, se suelen almacenar fuera de la base de datos, con lo que resulta difícil administrarlos.

NotaNota

Debe instalar .NET Framework 3.5 Service Pack 1 (o posterior) para trabajar con datos de FILESTREAM con SqlClient.

La especificación del atributo FILESTREAM en una columna varbinary(max) provoca que SQL Server almacene los datos en el sistema de archivos NTFS local en lugar de hacerlo en el archivo de base de datos. Aunque se almacenan por separado, puede usar las mismas instrucciones Transact-SQL admitidas para trabajar con los datos varbinary(max) almacenados en la base de datos.

Compatibilidad de SqlClient con FILESTREAM

El proveedor de datos .NET para SQL Server, System.Data.SqlClient, admite la lectura y escritura en datos de FILESTREAM mediante la clase SqlFileStream definida en el espacio de nombres System.Data.SqlTypes. SqlFileStream hereda de la clase System.IO.Stream, que proporciona métodos para leer y escribir en flujos de datos. La lectura de una secuencia transfiere los datos desde la secuencia a una estructura de datos como, por ejemplo, una matriz de bytes. La escritura transfiere los datos desde la estructura de datos hasta una secuencia.

Crear la tabla de SQL Server

Las instrucciones siguientes de Transact-SQL crean una tabla denominada employees e insertan una fila de datos. Una vez que ha habilitado el almacenamiento de FILESTREAM, puede usar esta tabla junto con los ejemplos de código que figuran a continuación. Al final de este tema se encuentran los vínculos a los recursos de los Libros en pantalla de 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

Ejemplo de lectura de datos de un FILESTREAM

El fragmento de código siguiente muestra cómo se leen datos de un FILESTREAM. El código obtiene la ruta de acceso lógica del archivo, y establece FileAccess en Read y FileOptions en SequentialScan. El código lee después los bytes del SqlFileStream en el búfer. Después los bytes se escriben en la ventana de la consola.

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

Ejemplo de sobrescritura de datos en un FILESTREAM

El fragmento de código siguiente muestra cómo se escriben datos en un FILESTREAM en el que se sobrescriben todos los datos existentes. El código obtiene la ruta de acceso lógica del archivo y crea SqlFileStream, estableciendo FileAccess en Write y FileOptions en SequentialScan. Se escribe un byte único en SqlFileStream, que remplaza los datos del archivo.

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

Ejemplo de inserción de datos en un FILESTREAM

El ejemplo siguiente muestra cómo se escriben datos en un FILESTREAM mediante el método Seek para anexar los datos al final del archivo. El código obtiene la ruta de acceso lógica del archivo y crea SqlFileStream, y establece FileAccess en ReadWrite y FileOptions en SequentialScan. El código usa el método Seek para buscar hasta el final del archivo, y anexa un byte único al archivo existente.

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

Recursos en los Libros en pantalla de SQL Server

La documentación completa de FILESTREAM se encuentra en las secciones siguientes de los Libros en pantalla de SQL Server 2008.

Tema

Descripción

Diseñar e implementar el almacenamiento de FILESTREAM

Proporciona vínculos a la documentación de FILESTREAM y a los temas relacionados.

Información general de FILESTREAM

Describe cuándo se usa el almacenamiento de FILESTREAM y cómo éste integra el Motor de base de datos de SQL Server con un sistema de archivos NTFS.

Introducción al almacenamiento mediante FILESTREAM

Describe cómo habilitar FILESTREAM en una instancia de SQL Server, cómo crear una base de datos y una tabla para los datos de un FILESTREAM almacenados y cómo manipular filas que contienen datos de un FILESTREAM.

Usar el almacenamiento FILESTREAM en aplicaciones cliente

Describe las funciones de la API de Win32 para trabajar con datos de un FILESTREAM.

FILESTREAM y otras características de SQL Server

Proporciona consideraciones, instrucciones y limitaciones para usar datos de un FILESTREAM con otras características de SQL Server.

Vea también

Conceptos

Seguridad de acceso del código y ADO.NET

Otros recursos

Tipos de datos de SQL Server y ADO.NET

Recuperación y modificación de datos en ADO.NET

Datos binarios y de valores grandes de SQL Server (ADO.NET)