Aracılığıyla paylaş


Parametreleri ve parametre veri türlerini yapılandırma

Komut nesneleri, değerleri SQL deyimlerine veya saklı yordamlara geçirmek için parametreleri kullanarak tür denetimi ve doğrulama sağlar. Komut metninin aksine, parametre girişi yürütülebilir kod olarak değil değişmez değer olarak değerlendirilir. Bu, bir saldırganın sunucuda güvenliği tehlikeye atan bir komutu SQL deyimine eklediği "SQL ekleme" saldırılarına karşı korumaya yardımcı olur.

Parametreli komutlar, veritabanı sunucusunun gelen komutu doğru bir önbelleğe alınmış sorgu planıyla eşleştirmesine yardımcı olduğundan sorgu yürütme performansını da iyileştirebilir. Daha fazla bilgi için bkz . Yürütme Planı Önbelleğe Alma ve Yeniden Kullanma ile Parametreler ve Yürütme Planı Yeniden Kullanımı. Güvenlik ve performans avantajlarına ek olarak, parametreli komutlar bir veri kaynağına geçirilen değerleri düzenlemek için kullanışlı bir yöntem sağlar.

Bir DbParameter nesne oluşturucu kullanılarak veya koleksiyonun DbParameterCollection yöntemi Add çağrılarak öğesine eklenerek DbParameterCollection oluşturulabilir. Add yöntemi, veri sağlayıcısına bağlı olarak ya oluşturucu bağımsız değişkenlerini ya da mevcut parametre nesnesini giriş olarak alır.

ParameterDirection özelliğini sağlama

Parametre eklerken, giriş parametreleri dışında parametreler için bir ParameterDirection özellik sağlamanız gerekir. Aşağıdaki tabloda, sabit listesiyle ParameterDirection kullanabileceğiniz değerler gösterilmektedirParameterDirection.

Üye adı Açıklama
Input parametresi bir giriş parametresidir. Bu varsayılan seçenektir.
InputOutput parametresi hem giriş hem de çıkış gerçekleştirebilir.
Output parametresi bir çıkış parametresidir.
ReturnValue parametresi saklı yordam, yerleşik işlev veya kullanıcı tanımlı işlev gibi bir işlemden döndürülen değeri temsil eder.

Parametre yer tutucularıyla çalışma

Parametre yer tutucularının söz dizimi veri kaynağına bağlıdır. .NET Framework veri sağlayıcıları, parametreleri ve parametre yer tutucularını adlandırma ve belirtme işlemlerini farklı şekilde işler. Bu söz dizimi, aşağıdaki tabloda açıklandığı gibi belirli bir veri kaynağına özelleştirilir.

Veri sağlayıcı Parametre adlandırma söz dizimi
System.Data.SqlClient parametername biçiminde @adlandırılmış parametreleri kullanır.
System.Data.OleDb Soru işareti (? ) ile gösterilen konumsal parametre işaretçilerini kullanır.
System.Data.Odbc Soru işareti (? ) ile gösterilen konumsal parametre işaretçilerini kullanır.
System.Data.OracleClient Adlandırılmış parametreleri parmname (veya parmname:) biçiminde kullanır.

Parametre veri türlerini belirtme

Parametrenin veri türü .NET Framework veri sağlayıcısına özgüdür. Tür belirtmek, bir değeri veri kaynağına geçirmeden önce .NET Framework veri sağlayıcısı türüne dönüştürür. Ayrıca, Parameter nesnesinin DbType özelliğini belirli bir Parameter yaparak DbType türünü genel bir şekilde belirtebilirsiniz.

Bir Parameter nesnesinin .NET Framework veri sağlayıcısı türü, Value nesnesinin Parameter .NET Framework türünden veya DbType nesnesinin Parameter türünden çıkarılır. Aşağıdaki tabloda, değer olarak geçirilen Parameter nesnesine veya belirtilen Parameter'ye göre çıkarılmış DbType türü gösterilmektedir.

.NET Framework türü DbType SqlDbType OleDbType OdbcType OracleType
Boolean Boolean (Boole Mantığı) Parça Boolean (Boole Mantığı) Parça Bayt
Byte Bayt TinyInt UnsignedTinyInt TinyInt Bayt
bayt[] İkilik VarBinary. Bayt dizisi 8000 bayt olan VarBinary'nin maksimum boyutundan büyükse bu örtük dönüştürme başarısız olur. 8000 bayttan büyük bayt dizileri için öğesini açıkça ayarlayın SqlDbType. VarBinary İkilik Ham
Char Karakterden SqlDbType türetme desteklenmez. Karakter Karakter Bayt
DateTime TarihSaat TarihSaat DBTimeStamp TarihSaat TarihSaat
DateTimeOffset TarihSaatOfseti SQL Server 2008'de DateTimeOffset. DateTimeOffset'ten çıkarım yapılması, SQL Server 2008'den önceki SQL Server sürümlerinde desteklenmez. TarihSaat
Decimal Ondalık Ondalık Ondalık Sayısal Sayı
Double Çift Yüzdürme Çift Çift Çift
Single Bekar Gerçek Bekar Gerçek Yüzdürme
Guid GUID UniqueIdentifier GUID UniqueIdentifier Ham
Int16 Int16 SmallInt SmallInt SmallInt Int16
Int32 Int32 Int Int Int Int32
Int64 Int64 BigInt BigInt BigInt Sayı
Object Nesne Varyant Varyant Nesneden OdbcType çıkartılması desteklenmiyor. Damlacık
String Dize NVarChar. Dize en büyük NVarChar boyutundan büyükse (4000 karakter) bu örtük dönüştürme başarısız olur. 4000 karakterden büyük dizeler için SqlDbType öğesini açıkça ayarlayın. VarWChar NVarChar NVarChar
TimeSpan Zaman SQL Server 2008'de zaman. SQL Server 2008'den önceki versiyonlarda TimeSpan'dan SqlDbType çıkarımı desteklenmez. DBTime Zaman TarihSaat
UInt16 UInt16 UInt16'dan SqlDbType çıkarılması desteklenmez. İşaretsiz Küçük Tamsayı Int UInt16
UInt32 UInt32 UInt32'den SqlDbType çıkarımı yapılamaz. İşaretsiz Tamsayı BigInt UInt32
UInt64 UInt64 UInt64'ten SqlDbType türetme desteklenmez. UnsignedBigInt Sayısal Sayı
AnsiString VarChar VarChar VarChar VarChar
AnsiStringSabitUzunluk Karakter Karakter Karakter Karakter
Para birimi Para Para birimi OdbcType'dan Currency çıkarım yapmak desteklenmez. Sayı
Tarih SQL Server 2008'de tarih. SQL Server 2008'den önceki SQL Server sürümlerinde Tarih'ten çıkarsama desteklenmez. DBDate (Veritabanı Tarihi) Tarih TarihSaat
SByte SByte'ten SqlDbType çıkarsama desteklenmez. TinyInt SByte'ten OdbcType türetme desteklenmez. SByte
SabitUzunluktaDizi NChar WChar NChar NChar
Zaman SQL Server 2008'de zaman. SQL Server'ın 2008'den önceki sürümlerinde, Zaman verisinden SqlDbType çıkarım yapılamaz. DBTime Zaman TarihSaat
VarNumeric VarNumeric'ten çıkarım SqlDbType desteklenmez. VarNumeric VarNumeric'ten çıkarım OdbcType desteklenmez. Sayı
kullanıcı tanımlı tür (şunu içeren bir nesne) SqlUserDefinedAggregateAttribute Nesne veya Dize, sağlayıcıya bağlı olarak (SqlClient her zaman bir Nesne döndürür, Odbc her zaman bir Dize döndürür ve OleDb yönetilen veri sağlayıcısı her ikisini de görebilir Varsa SqlDbType.Udt SqlUserDefinedTypeAttribute , aksi takdirde Variant OleDbType.VarWChar (değer null ise) aksi takdirde OleDbType.Variant. OdbcType.NVarChar desteklenmiyor

Not

Ondalıktan diğer türlere dönüştürmeler, ondalık değeri sıfıra doğru en yakın tamsayı değerine yuvarlayan dönüştürmeleri daraltmaktır. Dönüştürmenin sonucu hedef türünde temsil edilemiyorsa, bir OverflowException oluşturulur.

Not

Sunucuya null parametre değeri gönderdiğinizde, ( Visual Basic'te)DBNull değil null belirtmelisinizNothing. Sistemdeki null değer, değeri olmayan boş bir nesnedir. DBNull null değerleri temsil etmek için kullanılır. Veritabanı null değerleri hakkında daha fazla bilgi için bkz . Null Değerleri İşleme.

Parametre bilgilerini türetme

Parametreler, DbCommandBuilder sınıfı kullanılarak bir saklı yordamdan da türetilebilir. SqlCommandBuilder Hem hem de OleDbCommandBuilder sınıfları, DeriveParameterssaklı yordamdaki parametre bilgilerini kullanan bir komut nesnesinin parametre koleksiyonunu otomatik olarak dolduran statik bir yöntem sağlar. Mevcut komut parametre bilgilerini DeriveParameters'in üzerine yazdığını unutmayın.

Not

Parametre bilgilerinin türetilmesi, bilgileri almak için veri kaynağına ek bir gidiş dönüş gerektirdiğinden bir performans cezasına neden olur. Parametre bilgileri tasarım zamanında biliniyorsa, parametreleri açıkça ayarlayarak uygulamanızın performansını geliştirebilirsiniz.

Daha fazla bilgi için bkz . CommandBuilders ile Komut Oluşturma.

SqlCommand ve saklı yordam ile parametreleri kullanma

Saklı yordamlar, veri temelli uygulamalarda birçok avantaj sunar. Saklı yordamlar kullanılarak veritabanı işlemleri tek bir komutta kapsüllenebilir, en iyi performans için iyileştirilebilir ve ek güvenlikle geliştirilebilir. ADO.NET Parameters nesnesinin DbCommand koleksiyonunu kullanarak saklı yordam parametrelerini daha açık bir şekilde tanımlayabilir, çıkış parametrelerine ve dönüş değerlerine erişebilirsiniz. Saklı yordamlar, saklı yordam adının ve ardından parametrelerin bir SQL deyimi olarak geçirilmesiyle çağrılabilse de, bu yöntem daha fazla esneklik sağlar.

Not

Parametreli ifadeler, sp_executesql kullanılarak sunucuda yürütülür ve bu da sorgu planının yeniden kullanılmasına olanak tanır. Toplu iş içindeki sp_executesql yerel imleçler veya değişkenler, sp_executesql toplu işlem tarafından çağrıldığında görünmez. Veritabanı bağlamındaki değişiklikler yalnızca deyiminin sp_executesql sonuna kadar sürer. Daha fazla bilgi için bkz . sp_executesql (Transact-SQL).

SQL Server saklı yordamını yürütmek için SqlCommand parametrelerini kullanırken, Parameters koleksiyonuna eklenen parametrelerin adları, saklı yordamdaki parametre işaretleyicilerinin adlarıyla aynı olmalıdır. SQL Server için .NET Framework Veri Sağlayıcısı, bir SQL ifadesine veya saklı işlemine parametre iletmek için soru işareti (?) yer tutucusunu desteklemez. Saklı yordamdaki parametreleri adlandırılmış parametreler olarak ele alır ve eşleşen parametre işaretçilerini arar. Örneğin, CustOrderHist saklı yordam @CustomerID adlı bir parametre kullanılarak tanımlanır. Kodunuz saklı yordamı yürüttüğünde, adlı @CustomerIDbir parametre de kullanmalıdır.

CREATE PROCEDURE dbo.CustOrderHist @CustomerID varchar(5)

Örnek

Bu örnek, Northwind örnek veritabanında SQL Server saklı yordamının nasıl çağrılacağını göstermektedir. Saklı yordamın adı dbo.SalesByCategory olup, veri türü @CategoryName olan nvarchar(15) adlı bir giriş parametresine sahiptir. Kod, prosedür sona erdiğinde bağlantının sonlandırılması için bir using bloğu içinde yeni bir SqlConnection oluşturur. SqlCommand ve SqlParameter nesneleri oluşturulur ve özellikleri ayarlanır. Bir SqlDataReaderSqlCommand komutunu yürütür ve saklı yordamdan sonuç kümesini döndürür, çıkışı konsol penceresinde görüntüler.

Not

SqlCommand ve SqlParameter nesnelerini oluşturup sonra özellikleri ayrı deyimlerde ayarlamak yerine, birden fazla özelliği tek bir deyimde ayarlamak için aşırı yüklenmiş bir oluşturucu kullanarak yapabilirsiniz.

static void GetSalesByCategory(string connectionString,
    string categoryName)
{
    using (SqlConnection connection = new(connectionString))
    {
        // Create the command and set its properties.
        SqlCommand command = new()
        {
            Connection = connection,
            CommandText = "SalesByCategory",
            CommandType = CommandType.StoredProcedure
        };

        // Add the input parameter and set its properties.
        SqlParameter parameter = new()
        {
            ParameterName = "@CategoryName",
            SqlDbType = SqlDbType.NVarChar,
            Direction = ParameterDirection.Input,
            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($"{reader[0]}: {reader[1]:C}");
                }
            }
            else
            {
                Console.WriteLine("No rows found.");
            }
            reader.Close();
        }
    }
}
Shared Sub GetSalesByCategory(ByVal connectionString As String, _
    ByVal categoryName As String)

    Using connection As New SqlConnection(connectionString)

        ' Create the command and set its properties.
        Dim command As SqlCommand = New SqlCommand()
        command.Connection = connection
        command.CommandText = "SalesByCategory"
        command.CommandType = CommandType.StoredProcedure

        ' Add the input parameter and set its properties.
        Dim parameter As 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 reader As SqlDataReader = command.ExecuteReader()

            If reader.HasRows Then
                Do While reader.Read()
                    Console.WriteLine("{0}: {1:C}", _
                      reader(0), reader(1))
                Loop
            Else
                Console.WriteLine("No rows returned.")
            End If
        End Using
    End Using
End Sub

OleDbCommand veya OdbcCommand ile parametreleri kullanma

OleDbCommand veya OdbcCommand ile parametreleri kullanırken, Parameters koleksiyonuna eklenen parametrelerin sırası, saklı yordamınızda tanımlanan parametrelerin sırasıyla eşleşmelidir. .NET Framework OLE DB Veri Sağlayıcısı ve .NET Framework ODBC Veri Sağlayıcısı, saklı yordamdaki parametreleri yer tutucular olarak değerlendirir ve parametre değerlerini sırayla uygular. Ayrıca, dönüş değeri parametreleri koleksiyona Parameters eklenen ilk parametreler olmalıdır.

OLE DB için .NET Framework Veri Sağlayıcısı ve ODBC için .NET Framework Veri Sağlayıcısı, bir SQL deyimine veya saklı yordama parametre geçirmek için adlandırılmış parametreleri desteklemez. Bu durumda, aşağıdaki örnekte olduğu gibi soru işareti (?) yer tutucusunu kullanmanız gerekir.

SELECT * FROM Customers WHERE CustomerID = ?

Sonuç olarak, Parameter nesnelerinin koleksiyona eklenme sırası, Parameters öğesinin konumuna doğrudan karşılık gelmelidir. parametre için yer tutucu.

OleDb Örneği

Dim command As OleDbCommand = New OleDbCommand( _
  "SampleProc", connection)
command.CommandType = CommandType.StoredProcedure

Dim parameter As OleDbParameter = command.Parameters.Add( _
  "RETURN_VALUE", OleDbType.Integer)
parameter.Direction = ParameterDirection.ReturnValue

parameter = command.Parameters.Add( _
  "@InputParm", OleDbType.VarChar, 12)
parameter.Value = "Sample Value"

parameter = command.Parameters.Add( _
  "@OutputParm", OleDbType.VarChar, 28)
parameter.Direction = ParameterDirection.Output
OleDbCommand command = new OleDbCommand("SampleProc", connection);
command.CommandType = CommandType.StoredProcedure;

OleDbParameter parameter = command.Parameters.Add(
  "RETURN_VALUE", OleDbType.Integer);
parameter.Direction = ParameterDirection.ReturnValue;

parameter = command.Parameters.Add(
  "@InputParm", OleDbType.VarChar, 12);
parameter.Value = "Sample Value";

parameter = command.Parameters.Add(
  "@OutputParm", OleDbType.VarChar, 28);
parameter.Direction = ParameterDirection.Output;

Odbc Örneği

Dim command As OdbcCommand = New OdbcCommand( _
  "{ ? = CALL SampleProc(?, ?) }", connection)
command.CommandType = CommandType.StoredProcedure

Dim parameter As OdbcParameter = command.Parameters.Add("RETURN_VALUE", OdbcType.Int)
parameter.Direction = ParameterDirection.ReturnValue

parameter = command.Parameters.Add( _
  "@InputParm", OdbcType.VarChar, 12)
parameter.Value = "Sample Value"

parameter = command.Parameters.Add( _
  "@OutputParm", OdbcType.VarChar, 28)
parameter.Direction = ParameterDirection.Output
OdbcCommand command = new OdbcCommand( _
  "{ ? = CALL SampleProc(?, ?) }", connection);
command.CommandType = CommandType.StoredProcedure;

OdbcParameter parameter = command.Parameters.Add( _
  "RETURN_VALUE", OdbcType.Int);
parameter.Direction = ParameterDirection.ReturnValue;

parameter = command.Parameters.Add( _
  "@InputParm", OdbcType.VarChar, 12);
parameter.Value = "Sample Value";

parameter = command.Parameters.Add( _
  "@OutputParm", OdbcType.VarChar, 28);
parameter.Direction = ParameterDirection.Output;

Ayrıca bkz.