Sdílet prostřednictvím


Konfigurace parametrů

Platí pro: .NET Framework .NET .NET Standard

Stáhnout ADO.NET

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

Viz také