Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Použijte streamovací metody Microsoft.Data.SqlClient ke zpracování velkých hodnot bez předchozího načtení celé hodnoty do aplikační paměti. Streamování je užitečné pro binární soubory, velký text, XML, JSON a přenos mezi servery.
Streamování neumožní v hodnotě vyhledávat ani nezajistí bezpečné souběžné operace se čtečkou. Spojení, příkaz, čtečka, zdrojový tok a cílový objekt musí zůstat živé až do dokončení přenosu.
Příklady v tomto článku předpokládají, že otevřené SqlConnection s názvem connection cílí na ukázkovou databázi AdventureWorks.
Příklady v C# vyžadují using Microsoft.Data.SqlClient;. Příklady, které používají SqlDbType nebo CommandBehavior také vyžadují using System.Data;.
Streamování dat z SQL databáze
Příkaz proveďte pomocí CommandBehavior.SequentialAccess a čtěte sloupce v pořadí. Při sekvenčním přístupu po posunu za sloupec nečtěte předchozí sloupec ve stejném řádku.
Použijte tyto SqlDataReader metody:
| Metoda | Výsledek | Typická data SQL |
|---|---|---|
| GetStream | Stream | binary, varbinary, image a uživatelsky definovaná data typu (UDT) |
| GetTextReader | TextReader | Znaková a JSON data |
| GetXmlReader | XmlReader | xml |
Před vyžádáním streamu pro nullable sloupec zavolejte IsDBNull. Streamovací getter používaný s nekompatibilním SQL typem hází. Spotřebujte nebo zlikvidujte aktuální datový proud před čtením dalšího sloupce, posunutím řádku nebo přechodem k dalšímu výsledku.
GetStream není pro šifrované sloupce podporováno.
GetTextReader nepodporuje sekvenční přístup k zašifrovanému sloupci.
CommandTimeout platí, když Microsoft.Data.SqlClient čeká na síťové pakety během provádění a čtení. Čas, který vaše aplikace stráví zpracováním již přijatých dat, se nezapočítává. Pro zrušení a časové limity viz Asynchronní programování.
Streamovat binární data
AdventureWorks ukládá obsah souboru do nullable sloupce typu varbinary(max)Production.Document.Document. Tento příklad zkopíruje jednu hodnotu do souboru s omezeným bufferem:
using var command = new SqlCommand("""
SELECT TOP (1) Document
FROM Production.Document
WHERE Document IS NOT NULL
ORDER BY ModifiedDate DESC;
""", connection);
using SqlDataReader reader = command.ExecuteReader(
CommandBehavior.SequentialAccess);
if (reader.Read())
{
using Stream source = reader.GetStream(0);
using FileStream destination = File.Create("document.bin");
source.CopyTo(destination);
}
Pro text použijte GetTextReader a zkopírujte do TextWriter. Pro XML používejte GetXmlReader a zpracovávejte XML uzly bez převodu celé hodnoty na řetězec.
Streamování dat do SQL databáze
Nastavte Value na streamovací objekt a vyberte kompatibilní typ SQL:
| Typ hodnoty | Kompatibilní typy parametrů |
|---|---|
| Stream |
Binary, VarBinary a starší typ Image |
| TextReader |
Char, NChar, VarChar, NVarChar, starší typy Text a NText, Xml, a Json |
| XmlReader |
Char, NChar, VarChar, NVarChar, starší typy Text a NText, Xml, a Json |
Explicitně nastavte Size .
Size omezuje množství přenesených dat. Použijte -1 pro parametr (max), když chcete poslat kompletní zdroj.
Pro přenos s omezenou pamětí použijte VarBinary, NVarChar nebo Size = -1 s Xml, nebo použijte Json nebo VarChar. Microsoft.Data.SqlClient ukládá zdroj do bajtového pole nebo řetězce před vykonáním pro neznakové (max) a binární typy a pro starší typy Image, Text a NText.
Streamujte hodnotu parametru
Tento příklad odešle soubor přes parametr varbinary(max) a vrátí počet přijatých bajtů. Neukládá hodnotu:
using FileStream input = File.OpenRead("document.bin");
using var command = new SqlCommand(
"SELECT DATALENGTH(@content);",
connection);
command.Parameters.Add(
new SqlParameter("@content", SqlDbType.VarBinary, -1)
{
Value = input
});
long length = (long)command.ExecuteScalar()!;
Console.WriteLine($"{length} bytes");
Nechte vstupní objekt otevřený, dokud se provádění příkazu nedokončí. Předejte token zrušení asynchronní metodě provádění nebo zavolejte Cancel a požádejte o zrušení streamovací operace. Zrušení proběhne v rámci možností. Operace může být dokončena dříve, než zrušení začne platit.
Výjimka ze zdrojového proudu nebo čtečky naruší vykonávání příkazu. Nezkoušejte to znovu ze stejného objektu, pokud můžete určit jeho pozici a databázovou operaci lze bezpečně opakovat.
Streamujte data z jedné SQL databáze do druhé
Tento příklad předává proud dokumentů AdventureWorks přímo parametru v jiném otevřeném SqlConnection s názvem destinationConnection. Ukázkový příkaz hlásí přijatou délku. Nahraďte ji parametrizovaným příkazem pro vložení nebo aktualizaci cílové databáze:
using var readSource = new SqlCommand("""
SELECT TOP (1) Document
FROM Production.Document
WHERE Document IS NOT NULL
ORDER BY ModifiedDate DESC;
""", connection);
using SqlDataReader sourceReader = readSource.ExecuteReader(
CommandBehavior.SequentialAccess);
if (sourceReader.Read())
{
using Stream content = sourceReader.GetStream(0);
using var write = new SqlCommand(
"SELECT DATALENGTH(@content);",
destinationConnection);
write.Parameters.Add(
new SqlParameter("@content", SqlDbType.VarBinary, -1)
{
Value = content
});
Console.WriteLine(write.ExecuteScalar());
}
Příkazy zdroj a cíl nesdílejí transakci. Pokud vaše aplikace vyžaduje koordinovanou atomovou práci napříč servery, navrhněte a otestujte tuto transakční hranici zvlášť.