Supporto FILESTREAM nel driver OLE DB per SQL Server

Si applica a: SQL Server - solo Windows

Download del driver OLE DB

A partire da SQL Server 2008 (10.0.x), OLE DB Driver per SQL Server supporta la funzionalità FILESTREAM avanzata. Per esempi, vedere FILESTREAM e OLE DB.

FILESTREAM consente di archiviare e accedere a valori binari di grandi dimensioni mediante SQL Server o accesso diretto al file system di Windows. Un valore binario di grandi dimensioni è un valore superiore a 2 gigabyte (GB). Per altre informazioni sul supporto FILESTREAM avanzato, vedere FILESTREAM (SQL Server).

Quando viene aperta una connessione al database, @@TEXTSIZE è impostata su -1 (illimitato), per impostazione predefinita.

È anche possibile accedere alle colonne FILESTREAM e aggiornarle utilizzando l'API del file system di Windows.

Per altre informazioni, vedere Accedere ai dati FILESTREAM con OpenSqlFilestream.

Query per colonne FILESTREAM

I set di righe dello schema in OLE DB non segnalano se una colonna è una colonna FILESTREAM. ITableDefinition in OLE DB non può essere usato per creare una colonna FILESTREAM.

Per creare colonne FILESTREAM o per rilevare quali colonne esistenti sono colonne FILESTREAM, è possibile usare la is_filestream colonna della vista del catalogo sys.columns .

Di seguito è riportato uno script di esempio:

-- 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'
    );

Compatibilità con le versioni precedenti

Se il client è stato compilato usando OLE DB Driver per SQL Server e l'applicazione si connette a SQL Server 2012 (11.x) e versioni successive, il comportamento varbinary(max) è compatibile con il comportamento introdotto da SQL Server Native Client in SQL Server 2005 (9.x). Ovvero, la dimensione massima dei dati restituiti è limitata a 2 GB. Per i valori dei risultati maggiori di 2 GB, si verifica il troncamento e viene restituito un avviso di troncamento a destra dei dati stringa.

Quando la compatibilità dei tipi di dati è impostata su 80, il comportamento del client è coerente con il comportamento del client di livello inferiore.

Per i client che usano SQLOLEDB o altri provider rilasciati prima di SQL Server 2005 (9.x), viene eseguito il mapping di varbinary(max) all'immagine.

Commenti

  • Per inviare e ricevere valori varbinary(max) maggiori di 2 GB, un'applicazione usa DBTYPE_IUNKNOWN nei binding di parametri e risultati. Per i parametri il provider deve chiamare IUnknown::QueryInterface per ISequentialStream e per i risultati che restituiscono ISequentialStream.

  • Per OLE DB, il controllo relativo ai valori ISequentialStream è rilassato. Quando wType si trova DBTYPE_IUNKNOWN nello DBBINDING struct, il controllo della lunghezza può essere disabilitato omettendo DBPART_LENGTH da dwPart o impostando la lunghezza dei dati (in corrispondenza dell'offset obLength nel buffer di dati) su ~0. In questo caso, il provider non controlla la lunghezza del valore e richiede e restituisce tutti i dati disponibili tramite il flusso. Questa modifica viene applicata a tutti i tipi LOB (Large Object) e XML, ma solo quando si è connessi a server SQL Server 2005 (9.x) (o versioni successive). Ciò garantisce una maggiore flessibilità per gli sviluppatori, mantenendo al contempo la coerenza e la compatibilità con le versioni precedenti per le applicazioni esistenti e i server di livello inferiore. Questa modifica influisce su tutte le interfacce che trasferiscono dati, principalmente IRowset::GetData, ICommand::Executee IRowsetFastLoad::InsertRow.