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.
Platí pro: .NET Framework
.NET
.NET Standard
Objekty příkazů používají parametry k předání hodnot příkazům SQL nebo uloženým procedurám, které poskytují kontrolu typů a ověřování. Na rozdíl od textu příkazu se vstup parametru považuje za literálovou hodnotu, ne jako spustitelný kód. Toto chování pomáhá chránit před útoky prostřednictvím injektáže SQL, ve kterém útočník vloží příkaz, který na serveru ohrožuje zabezpečení, do příkazu SQL.
Parametrizované příkazy můžou také zlepšit výkon provádění dotazů, protože pomáhají databázovému serveru přesně odpovídat příchozímu příkazu se správným plánem dotazů uloženým v mezipaměti. Další informace najdete v tématu Ukládání plánu provádění do mezipaměti a opakované použití a parametry a opětovné použití plánu provádění. Kromě výhod zabezpečení a výkonu poskytují parametrizované příkazy pohodlný způsob uspořádání hodnot předaných zdroji dat.
Objekt DbParameter lze vytvořit pomocí jeho konstruktoru nebo přidáním do DbParameterCollection voláním metody Add kolekce DbParameterCollection. Metoda Add bude v závislosti na zprostředkovateli dat brát jako vstupní argumenty konstruktoru nebo existující objekt parametru.
Zadejte vlastnost ParameterDirection.
Při přidávání parametrů musíte zadat ParameterDirection vlastnost pro jiné parametry než vstupní parametry. Následující tabulka ukazuje hodnoty ParameterDirection, které můžete použít s výčtovým typem ParameterDirection.
| Název členu | Description |
|---|---|
| Input | Parametr je vstupní parametr. Tato hodnota je výchozí. |
| InputOutput | Parametr může provádět vstup i výstup. |
| Output | Parametr je výstupní parametr. |
| ReturnValue | Parametr představuje návratovou hodnotu z operace, jako je uložená procedura, integrovaná funkce nebo uživatelem definovaná funkce. |
Práce se zástupnými symboly parametrů
Syntaxe zástupných symbolů parametrů závisí na zdroji dat. Zprostředkovatel dat Microsoft SqlClient pro SQL Server zpracovává pojmenování a zadává parametry a zástupné symboly parametrů odlišně. Zprostředkovatel dat SqlClient používá pojmenované parametry ve formátu @parametername.
Zadání datových typů parametrů
Datový typ parametru je specifický pro zprostředkovatele dat Microsoft SqlClient pro SQL Server. Určení typu převede hodnotu Parameter na zprostředkovatele dat Microsoft SqlClient pro typ SQL Serveru před předáním hodnoty do zdroje dat. Typ objektu Parameter můžete také zadat obecným způsobem nastavením DbType vlastnosti objektu Parameter na určitý DbType.
Zprostředkovatel dat Microsoft SqlClient pro SQL Server typ Parameter objektu je odvozen z typu Value objektu Parameter rozhraní .NET Framework, nebo z typu DbType objektu Parameter. Následující tabulka ukazuje odvozený Parameter typ na základě objektu předaného jako Parameter nebo specifikovaného DbType.
| Typ .NET | DbType | SqlDbType |
|---|---|---|
| Boolean | Boolean |
Bit |
| Byte | Byte |
TinyInt |
byte[] |
Binary |
VarBinary. Tento implicitní převod selže, pokud je pole bajtů větší než maximální velikost bajtu VarBinary, což je 8 000 bajtů. Pro bajtová pole větší než 8 000 bajtů explicitně nastavte SqlDbType. |
| Char | Odvozování z SqlDbType pomocí znaku se nepodporuje. | |
| DateTime | DateTime |
DateTime |
| DateTimeOffset | DateTimeOffset |
DateTimeOffset v systému SQL Server 2008. Odvozování SqlDbType z DateTimeOffset není podporováno ve verzích SQL Serveru starších než SQL Server 2008. |
| Decimal | Decimal |
Decimal |
| Double | Double |
Float |
| Single | Single |
Real |
| Guid | Guid |
UniqueIdentifier |
| Int16 | Int16 |
SmallInt |
| Int32 | Int32 |
Int |
| Int64 | Int64 |
BigInt |
| Object | Object |
Variant |
| String | String |
NVarChar. Tento implicitní převod selže, pokud je řetězec větší než maximální velikost NVarChar, což je 4000 znaků. Pro řetězce větší než 4000 znaků explicitně nastavte SqlDbType. |
| TimeSpan | Time |
Time v systému SQL Server 2008. Odvozování SqlDbType z TimeSpan není podporováno ve verzích SQL Serveru starších než SQL Server 2008. |
| UInt16 | UInt16 |
Odvození SqlDbType z UInt16 není podporováno. |
| UInt32 | UInt32 |
Odvození SqlDbType z UInt32 není podporováno. |
| UInt64 | UInt64 |
Odvození SqlDbType z UInt64 není podporováno. |
AnsiString |
VarChar |
|
AnsiStringFixedLength |
Char |
|
Currency |
Money |
|
Date |
Date v systému SQL Server 2008. Odvozování SqlDbType z Date není podporováno ve verzích SQL Serveru starších než SQL Server 2008. |
|
SByte |
Odvození SqlDbType z SByte není podporováno. |
|
StringFixedLength |
NChar |
|
Time |
Time v systému SQL Server 2008. Odvozování SqlDbType z Time není podporováno ve verzích SQL Serveru starších než SQL Server 2008. |
|
VarNumeric |
Odvození SqlDbType z VarNumeric není podporováno. |
|
| uživatelem definovaný typ (objekt s SqlUserDefinedAggregateAttribute) | SqlClient vždy vrací objekt. |
SqlDbType.Udt pokud SqlUserDefinedTypeAttribute je k dispozici, jinak Variant |
| SqlJson | String |
SqlDbType.Json |
| SqlVector<T> | Binary |
SqlDbType.Vector |
Poznámka:
Převody z desítkového na jiné typy jsou zužující převody, které zaokrouhlují desetinnou hodnotu na nejbližší celočíselnou hodnotu směrem k nule. Pokud výsledek převodu není v cílovém typu reprezentovatelný, vyvolá se OverflowException.
Poznámka:
JSON
Při předávání parametru Value typu stringnastavte SqlDbType na Json . V opačném případě má SqlDbType výchozí hodnotu Nvarchar.
Vektor
Pro datový typ vektoru SQL musí být zadán parametr Value typu Microsoft.Data.SqlTypes.SqlVector<T> . Parametr Size a dimenze vektoru jsou odvozeny z parametru Value.
Size Parametr je ignorován.
Poznámka:
Při odesílání hodnoty parametru null na server, musíte zadat DBNull, ne null (Nothing v jazyce Visual Basic). Hodnota null v systému je prázdný objekt, který nemá žádnou hodnotu.
DBNull slouží k reprezentaci hodnot null.
Odvození informací o parametrech
Parametry mohou být také odvozeny z uložené procedury pomocí DbCommandBuilder třídy.
SqlCommandBuilder Třída poskytuje statickou metodu, která automaticky naplní kolekci parametrů objektu příkazu, DeriveParameterskterá používá informace o parametrech z uložené procedury.
DeriveParameters přepíše všechny existující informace o parametrech pro příkaz.
Poznámka:
Odvození informací o parametrech způsobuje pokles výkonu, protože k načtení informací vyžaduje další odeslání odpovědi ze zdroje dat. Pokud jsou informace o parametrech známé v době návrhu, můžete zvýšit výkon aplikace nastavením parametrů explicitně.
Další informace naleznete v tématu Generování příkazů pomocí CommandBuilders.
Použití parametrů s SqlCommand a uloženou procedurou
Uložené procedury nabízejí mnoho výhod v aplikacích řízených daty. Pomocí uložených procedur je možné databázové operace zapouzdřovat jedním příkazem, optimalizovat je pro zajištění nejlepšího výkonu a zvýšit tak dodatečné zabezpečení. I když uloženou proceduru lze volat předáním názvu uložené procedury následované argumenty parametrů jako příkazu SQL, pomocí Parameters kolekce ADO.NET DbCommand objektu umožňuje explicitnější definování parametrů uložené procedury a přístup k výstupním parametrům a návratovým hodnotám.
Poznámka:
Parametrizované příkazy jsou na serveru spouštěny pomocí sp_executesql,, což umožňuje opakované použití plánu dotazů. Místní kurzory nebo proměnné v sp_executesql dávce nejsou viditelné pro dávku, která volá sp_executesql. Změny v kontextu databáze trvají pouze do konce sp_executesql příkazu. Další informace najdete v tématu sp_executesql (Transact-SQL).
Při použití parametrů spolu s SqlCommand pro spuštění uložené procedury SQL Serveru musí názvy parametrů přidaných do kolekce Parameters odpovídat názvům značek parametrů v uložené proceduře. Zprostředkovatel dat Microsoft SqlClient pro SQL Server nepodporuje zástupný symbol otazníku (?) pro předávání parametrů příkazu SQL nebo uložené proceduře. Zpracovává parametry v uložené proceduře jako pojmenované parametry a hledá odpovídající značky parametrů. Například uložená procedura CustOrderHist je definována pomocí parametru s názvem @CustomerID. Když váš kód spustí uloženou proceduru, musí také použít parametr s názvem @CustomerID.
CREATE PROCEDURE dbo.CustOrderHist @CustomerID varchar(5)
Example
Tento příklad ukazuje, jak volat uloženou proceduru SQL Serveru v Northwind ukázkové databázi. Název uložené procedury je dbo.SalesByCategory a má vstupní parametr pojmenovaný @CategoryName s datovým typem nvarchar(15). Kód vytvoří nový SqlConnection uvnitř bloku using, aby bylo připojení uvolněno, když procedura skončí. Objekty SqlCommand a SqlParameter objekty jsou vytvořeny a jejich vlastnosti jsou nastaveny. A SqlDataReader spustí SqlCommand uloženou proceduru a vrátí sadu výsledků, zobrazující výstup v okně konzoly.
Poznámka:
Místo vytváření objektů SqlCommand a SqlParameter a následného nastavení jejich vlastností v samostatných výrazech můžete použít jeden z přetížených konstruktorů k nastavení více vlastností v jednom výrazu.
static void GetSalesByCategory(string connectionString,
string categoryName)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
// Create the command and set its properties.
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = "SalesByCategory";
command.CommandType = CommandType.StoredProcedure;
// Add the input parameter and set its properties.
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@CategoryName";
parameter.SqlDbType = SqlDbType.NVarChar;
parameter.Direction = ParameterDirection.Input;
parameter.Value = categoryName;
// Add the parameter to the Parameters collection.
command.Parameters.Add(parameter);
// Open the connection and execute the reader.
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine("{0}: {1:C}", reader[0], reader[1]);
}
}
else
{
Console.WriteLine("No rows found.");
}
reader.Close();
}
}
}