Delen via


Parameters configureren

Van toepassing op: .NET Framework .NET Standard

ADO.NET downloaden

Opdrachtobjecten gebruiken parameters om waarden door te geven aan SQL-instructies of opgeslagen procedures, waarbij typecontrole en validatie wordt geboden. In tegenstelling tot opdrachttekst wordt parameterinvoer behandeld als een letterlijke waarde, niet als uitvoerbare code. Dit gedrag beschermt tegen aanvallen met SQL-injectie, waarbij een aanvaller een opdracht invoegt waarmee de beveiliging op de server in een SQL-instructie wordt aangetast.

Geparameteriseerde opdrachten kunnen ook de prestaties van de uitvoering van query's verbeteren, omdat ze de databaseserver helpen de binnenkomende opdracht nauwkeurig te vinden met een juist queryplan in de cache. Zie De cache van het uitvoeringsplan opslaan en opnieuw gebruiken en parameters en uitvoeringsplan hergebruiken voor meer informatie. Naast de voordelen van beveiliging en prestaties bieden geparameteriseerde opdrachten een handige methode voor het ordenen van waarden die worden doorgegeven aan een gegevensbron.

Een DbParameter object kan worden gemaakt met behulp van de constructor, of door het toe te voegen aan de DbParameterCollection door de Add methode van de DbParameterCollection collectie aan te roepen. De Add-methode neemt als invoer ofwel constructeurargumenten of een bestaand parameterobject, afhankelijk van de gegevensprovider.

Geef de eigenschap ParameterDirection op

Wanneer u parameters toevoegt, moet u een ParameterDirection eigenschap opgeven voor andere parameters dan invoerparameters. In de volgende tabel ziet u de ParameterDirection waarden die u met de ParameterDirection opsomming kunt gebruiken.

De naam van lid Description
Input De parameter is een invoerparameter. Dit is de standaardwaarde.
InputOutput De parameter kan zowel invoer als uitvoer uitvoeren.
Output De parameter is een uitvoerparameter.
ReturnValue De parameter vertegenwoordigt een retourwaarde van een bewerking, zoals een opgeslagen procedure, ingebouwde functie of door de gebruiker gedefinieerde functie.

Werken met plaatsaanduidingen voor parameters

De syntaxis voor tijdelijke aanduidingen voor parameters is afhankelijk van de gegevensbron. De Microsoft SqlClient-gegevensprovider voor SQL Server verwerkt de naamgeving en het opgeven van parameters en tijdelijke aanduidingen voor parameters anders. De SqlClient-gegevensprovider gebruikt benoemde parameters in de indeling @parametername.

Parametergegevenstypen opgeven

Het gegevenstype van een parameter is specifiek voor de Microsoft SqlClient-gegevensprovider voor SQL Server. Als u het type opgeeft, wordt de waarde van de Parameter waarde geconverteerd naar het type Microsoft SqlClient-gegevensprovider voor SQL Server voordat u de waarde doorgeeft aan de gegevensbron. U kunt ook het type van een Parameter op een algemene manier opgeven door de DbType eigenschap van het Parameter object in te stellen op een bepaald DbTypeobject.

De Microsoft SqlClient-gegevensprovider voor het SQL Server-type van een Parameter object wordt afgeleid van het .NET Framework-type van het ValueParameter object of van het DbTypeParameter object. In de volgende tabel ziet u het afgeleide Parameter type op basis van het object dat is doorgegeven als de Parameter waarde of de opgegeven DbType waarde.

.NET-type DbType SqlDbType
Boolean Boolean Bit
Byte Byte TinyInt
byte[] Binary VarBinary. Deze impliciete conversie mislukt als de bytematrix groter is dan de maximale grootte van een VarBinary, wat 8000 bytes is. Stel voor bytematrices die groter zijn dan 8000 bytes, expliciet de SqlDbType.
Char Het afleiden van een SqlDbType uit een teken wordt niet ondersteund.
DateTime DateTime DateTime
DateTimeOffset DateTimeOffset DateTimeOffset in SQL Server 2008. Het afleiden van een SqlDbType uit DateTimeOffset wordt niet ondersteund in versies van SQL Server ouder dan 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. Deze impliciete conversie mislukt als de tekenreeks groter is dan de maximale grootte van een NVarChartekenreeks, die 4000 tekens is. Stel voor tekenreeksen die groter zijn dan 4000 tekens, expliciet de SqlDbType.
TimeSpan Time Time in SQL Server 2008. Het afleiden van een SqlDbType uit TimeSpan wordt niet ondersteund in versies van SQL Server ouder dan SQL Server 2008.
UInt16 UInt16 Het afleiden van een SqlDbType uit UInt16 wordt niet ondersteund.
UInt32 UInt32 Het afleiden van een SqlDbType uit UInt32 wordt niet ondersteund.
UInt64 UInt64 Het afleiden van een SqlDbType uit UInt64 wordt niet ondersteund.
AnsiString VarChar
AnsiStringFixedLength Char
Currency Money
Date Date in SQL Server 2008. Het afleiden van een SqlDbType uit Date wordt niet ondersteund in versies van SQL Server ouder dan SQL Server 2008.
SByte Het afleiden van een SqlDbType uit SByte wordt niet ondersteund.
StringFixedLength NChar
Time Time in SQL Server 2008. Het afleiden van een SqlDbType uit Time wordt niet ondersteund in versies van SQL Server ouder dan SQL Server 2008.
VarNumeric Het afleiden van een SqlDbType uit VarNumeric wordt niet ondersteund.
door de gebruiker gedefinieerd type (een object met SqlUserDefinedAggregateAttribute) SqlClient retourneert altijd een object SqlDbType.Udt indien SqlUserDefinedTypeAttribute aanwezig, anders Variant
SqlJson String SqlDbType.Json
SqlVector<T> Binary SqlDbType.Vector

Opmerking

Conversies van decimaal naar andere typen zijn verkleinende conversies die de decimale waarde afronden naar de dichtstbijzijnde gehele waarde richting nul. Als het resultaat van de conversie niet kan worden weergegeven in het doeltype, wordt er een OverflowException gegenereerd.

Opmerking

JSON

Stel SqlDbType in op Json bij het doorgeven van een parameter Value van het type string. Anders wordt sqlDbType standaard ingesteld op Nvarchar.

Vector

Voor sql-vectorgegevenstype moet een parameter Value van het type Microsoft.Data.SqlTypes.SqlVector<T> worden opgegeven. Parameter Size - en vectordimensie worden afgeleid van de parameter Value. De parameter Size wordt genegeerd.

Opmerking

Wanneer u een null-parameterwaarde naar de server verzendt, moet u opgeven DBNull, niet null (Nothing in Visual Basic). De null-waarde in het systeem is een leeg object dat geen waarde heeft. DBNull wordt gebruikt om null-waarden weer te geven.

Parametergegevens afleiden

Parameters kunnen ook worden afgeleid van een opgeslagen procedure met behulp van de DbCommandBuilder klasse. De SqlCommandBuilder klasse biedt een statische methode, DeriveParameterswaarmee automatisch de parametersverzameling wordt ingevuld van een opdrachtobject dat parametergegevens uit een opgeslagen procedure gebruikt. DeriveParameters Overschrijft alle bestaande parametergegevens voor de opdracht.

Opmerking

Het afleiden van parameterinformatie veroorzaakt een prestatiestraf omdat hiervoor een extra retour naar de gegevensbron nodig is om de informatie op te halen. Als parametergegevens bekend zijn tijdens het ontwerp, kunt u de prestaties van uw toepassing verbeteren door de parameters expliciet in te stellen.

Zie Opdrachten genereren met CommandBuilders voor meer informatie.

Parameters gebruiken met een SqlCommand en een opgeslagen procedure

Opgeslagen procedures bieden veel voordelen in gegevensgestuurde toepassingen. Met behulp van opgeslagen procedures kunnen databasebewerkingen worden ingekapseld in één opdracht, geoptimaliseerd voor de beste prestaties en verbeterd met extra beveiliging. Hoewel een opgeslagen procedure kan worden aangeroepen door de naam van de opgeslagen procedure door te geven, gevolgd door parameterargumenten als sql-instructie, kunt u met behulp van de Parameters verzameling van het ADO.NET-object DbCommand expliciet opgeslagen procedureparameters definiëren en toegang krijgen tot uitvoerparameters en retourwaarden.

Opmerking

Geparameteriseerde instructies worden op de server uitgevoerd met behulp van sp_executesql,, waardoor het hergebruik van queryplannen mogelijk wordt. Lokale cursors of variabelen in de sp_executesql batch zijn niet zichtbaar voor de batch die aanroept sp_executesql. Wijzigingen in de databasecontext duren alleen tot het einde van de sp_executesql instructie. Zie sp_executesql (Transact-SQL) voor meer informatie.

Wanneer u parameters met een SqlCommand opgeslagen SQL Server-procedure gebruikt, moeten de namen van de parameters die aan de Parameters verzameling worden toegevoegd, overeenkomen met de namen van de parametermarkeringen in de opgeslagen procedure. De Microsoft SqlClient-gegevensprovider voor SQL Server biedt geen ondersteuning voor de vraagteken-plaatsaanduiding (?) voor de overdracht van parameters aan een SQL-instructie of een opgeslagen procedure. Hiermee worden parameters in de opgeslagen procedure behandeld als benoemde parameters en wordt gezocht naar overeenkomende parametermarkeringen. De opgeslagen procedure wordt bijvoorbeeld gedefinieerd door een parameter genaamd CustOrderHist te gebruiken. Wanneer uw code de opgeslagen procedure uitvoert, moet deze ook een parameter met de naam @CustomerIDgebruiken.

CREATE PROCEDURE dbo.CustOrderHist @CustomerID varchar(5)

Example

In dit voorbeeld ziet u hoe u een opgeslagen SQL Server-procedure aanroept in de Northwind voorbeelddatabase. De naam van de opgeslagen procedure is dbo.SalesByCategory en het heeft een invoerparameter met de naam @CategoryName en een gegevenstype nvarchar(15). De code maakt een nieuwe SqlConnection in een using-blok, zodat de verbinding wordt verwijderd wanneer de procedure wordt beëindigd. De SqlCommand en SqlParameter objecten worden gemaakt en hun eigenschappen worden ingesteld. Een SqlDataReader voert de SqlCommand uit en retourneert de resultaatset van de opgeslagen procedure, waarbij de uitvoer in het consolevenster wordt weergegeven.

Opmerking

In plaats van objecten te maken SqlCommand en SqlParameter vervolgens eigenschappen in afzonderlijke instructies in te stellen, kunt u ervoor kiezen om een van de overbelaste constructors te gebruiken om meerdere eigenschappen in één instructie in te stellen.

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

Zie ook