Compartir vía


Compatibilidad con FILESTREAM del controlador OLE DB para SQL Server

Se aplica a: SQL Server: solo Windows

Descargar controlador OLE DB

A partir de SQL Server 2008 (10.0.x), OLE DB Driver for SQL Server admite la característica FILESTREAM mejorada. Para ver ejemplos, consulte FILESTREAM y OLE DB.

FILESTREAM proporciona un modo de almacenar y obtener acceso a valores binarios grandes, ya sea a través de SQL Server o mediante acceso directo al sistema de archivos de Windows. Un valor binario grande es un valor superior a 2 gigabytes (GB). Para obtener más información acerca de la compatibilidad mejorada con FILESTREAM, consulte FILESTREAM (SQL Server).

Cuando se abre una conexión de base de datos, @@TEXTSIZE se establece en -1 (ilimitado) de forma predeterminada.

También es posible obtener acceso a columnas FILESTREAM y actualizarlas mediante las API del sistema de archivos de Windows.

Para obtener más información, vea Obtener acceso a los datos FILESTREAM con OpenSqlFilestream.

Consulta de columnas FILESTREAM

Los conjuntos de filas de esquema de OLE DB no notificarán si una columna es una columna FILESTREAM. ITableDefinition de OLE DB no puede utilizarse para crear una columna FILESTREAM.

Para crear columnas FILESTREAM o detectar qué columnas existentes son columnas FILESTREAM, puede usar la columna is_filestream de la vista de catálogo sys.columns.

El script siguiente es un ejemplo:

-- Create a table with a FILESTREAM column.
CREATE TABLE Bob_01 (
    GuidCol1 UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE DEFAULT NEWID(),
    IntCol2 INT,
    varbinaryCol3 VARBINARY(MAX) FILESTREAM
);

-- Find FILESTREAM columns.
SELECT name
FROM sys.columns
WHERE is_filestream = 1;

-- Determine whether a column is a FILESTREAM column.
SELECT is_filestream
FROM sys.columns
WHERE name = 'varbinaryCol3'
    AND object_id IN (
        SELECT object_id
        FROM sys.tables
        WHERE name = 'Bob_01'
    );

Compatibilidad con niveles inferiores

Si el cliente se compiló con OLE DB Driver for SQL Server y la aplicación se conecta a SQL Server 2012 (11.x) o una versión posterior, el comportamiento de varbinary(max) es compatible con el introducido por el cliente nativo de SQL Server en SQL Server 2005 (9.x). Es decir, el tamaño máximo de los datos devueltos se limita a 2 GB. Los resultados cuyo valor supere los 2 GB se truncan y se devuelve una advertencia de tipo "datos de cadena truncados por la derecha".

Cuando la compatibilidad de tipo de datos se establece en 80, el comportamiento del cliente es coherente con el comportamiento del cliente de nivel inferior.

En el caso de los clientes que utilicen SQLOLEDB u otros proveedores lanzados al mercado con anterioridad a la versión SQL Server 2005 (9.x), varbinary(max) se asignará a una imagen.

Comentarios

  • Para enviar y recibir valores varbinary(max) mayores de 2 GB, una aplicación usa DBTYPE_IUNKNOWN en enlaces de resultados y parámetros. En el caso de los parámetros, el proveedor debe llamar a IUnknown::QueryInterface para ISequentialStream y para los resultados que devuelven ISequentialStream.

  • Para OLE DB, la comprobación relacionada con los valores ISequentialStream es menos estricta. Cuando wType es DBTYPE_IUNKNOWN en el struct DBBINDING, la comprobación de longitud se puede deshabilitar omitiendo DBPART_LENGTH de dwPart o estableciendo la longitud de los datos (en el desplazamiento obLength del búfer de datos) en ~0. En este caso, el proveedor no comprueba la longitud del valor y solicita y devuelve todos los datos disponibles a través del flujo. Este cambio se aplica a todos los tipos de objeto grandes (LOB) y XML, pero solo cuando se realiza la conexión a los servidores SQL Server 2005 (9.x) (o posteriores). Esto proporciona mayor flexibilidad para los programadores, a la vez que se mantiene la coherencia y la compatibilidad con versiones anteriores para las aplicaciones existentes y los servidores de nivel inferior. Este cambio afecta a todas las interfaces que transfieren datos, principalmente IRowset::GetData, ICommand::Execute y IRowsetFastLoad::InsertRow.