Aracılığıyla paylaş


Parametreleri yapılandırma

Şunlar için geçerlidir: .NET Framework .NET .NET Standard

ADO.NET indirin

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 davranış, 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 nesnesi, oluşturucusu kullanılarak veya DbParameterCollection yöntemini çağırarak Add koleksiyonuna DbParameterCollection eklenerek oluşturulabilir. Add yöntemi, veri sağlayıcısına bağlı olarak oluşturucu argümanlarını veya mevcut bir parametre nesnesini giriş olarak alır.

ParameterDirection özelliğini sağlayın

Parametre eklerken, giriş parametreleri dışında parametreler için bir ParameterDirection özellik sağlamanız gerekir. Aşağıdaki tabloda, ParameterDirection numaralandırmasıyla kullanabileceğiniz ParameterDirection değerleri gösterilmektedir.

Üye adı Description
Input parametresi bir giriş parametresidir. Bu değer varsayılandır.
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. SQL Server için Microsoft SqlClient Veri Sağlayıcısı, parametreleri ve parametre yer tutucularını adlandırma ve belirtme işlemlerini farklı şekilde işler. SqlClient veri sağlayıcısı biçiminde @parameternameadlandırılmış parametreler kullanır.

Parametre veri türlerini belirtme

Bir parametrenin veri türü, SQL Server için Microsoft SqlClient Veri Sağlayıcısı'na özgüdür. Türü belirtmek, değeri veri kaynağına geçirmeden önce Parameter değerini Microsoft SqlClient Veri Sağlayıcısı'nın SQL Server türüne dönüştürür. Ayrıca, Parameter nesnesinin DbType özelliğini belirli bir Parameter olarak ayarlayarak DbType türünü genel bir şekilde belirtebilirsiniz.

Bir Parameter nesnesinin SQL Server türü için Microsoft SqlClient Veri Sağlayıcısı, Value nesnesinin Parameter öğesinin .NET Framework türünden veya DbType nesnesinin Parameter öğesinden çıkarım yapılır. Aşağıdaki tabloda, Parameter değeri olarak geçirilen veya belirtilen Parameter nesnesine göre çıkarılmış DbType türü gösterilmektedir.

.NET türü DbType SqlDbType
Boolean Boolean Bit
Byte Byte TinyInt
byte[] Binary VarBinary. Bayt dizisi en büyük boyutu VarBinaryolan 8000 bayttan büyükse bu örtük dönüştürme başarısız olur. 8000 bayttan büyük bayt dizileri için SqlDbType parametresini açıkça ayarlayın.
Char Karakterden SqlDbType çıkarım yapmak desteklenmez.
DateTime DateTime DateTime
DateTimeOffset DateTimeOffset DateTimeOffset sql server 2008'de. SQL Server 2008'den önceki SQL Server sürümlerinde SqlDbType'den DateTimeOffset çıkarma desteklenmez.
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. Dizi, NVarChar'nın en büyük boyutu olan 4000 karakterden büyükse, 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.
TimeSpan Time Time sql server 2008'de. SQL Server 2008'den önceki SQL Server sürümlerinde SqlDbType'den TimeSpan çıkarma desteklenmez.
UInt16 UInt16 SqlDbType öğesinden UInt16 öğesi çıkarımı desteklenmez.
UInt32 UInt32 SqlDbType öğesinden UInt32 öğesi çıkarımı desteklenmez.
UInt64 UInt64 SqlDbType öğesinden UInt64 öğesi çıkarımı desteklenmez.
AnsiString VarChar
AnsiStringFixedLength Char
Currency Money
Date Date sql server 2008'de. SQL Server 2008'den önceki SQL Server sürümlerinde SqlDbType'den Date çıkarma desteklenmez.
SByte SqlDbType öğesinden SByte öğesi çıkarımı desteklenmez.
StringFixedLength NChar
Time Time sql server 2008'de. SQL Server 2008'den önceki SQL Server sürümlerinde SqlDbType'den Time çıkarma desteklenmez.
VarNumeric SqlDbType öğesinden VarNumeric öğesi çıkarımı desteklenmez.
kullanıcı tanımlı tür (ile SqlUserDefinedAggregateAttributebir nesne) SqlClient her zaman bir Nesne döndürür SqlDbType.Udt varsa SqlUserDefinedTypeAttribute , aksi takdirde Variant
SqlJson String SqlDbType.Json
SqlVector<T> Binary SqlDbType.Vector

Uyarı

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.

Uyarı

JSON

türünde Valuebir parametre string geçirirken SqlDbType değerini Json olarak ayarlayın. Aksi takdirde SqlDbType varsayılan olarak olarak belirlenir Nvarchar.

Vektör

SQL vektör veri türü için tür Value parametresi Microsoft.Data.SqlTypes.SqlVector<T> belirtilmelidir. Parametre Size ve vektör boyutu parametresinden Valueçıkarılır. Parametre Size göz ardı edilir.

Uyarı

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.

Parametre bilgilerini türet

Parametreler, DbCommandBuilder sınıfı kullanılarak bir saklı yordamdan da türetilebilir. SqlCommandBuilder sınıfı, DeriveParameterssaklı yordamdaki parametre bilgilerini kullanan bir komut nesnesinin parametre koleksiyonunu otomatik olarak dolduran statik bir yöntem sağlar. DeriveParameters komutunun mevcut parametre bilgilerini geçersiz kılar.

Uyarı

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'in ve saklı yordamın parametrelerini 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. Bir saklı yordam, saklı yordam adını ve ardından parametre bağımsız değişkenlerini içeren bir SQL deyimi kullanılarak çağrılabilse de, 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.

Uyarı

Parametreli ifadeler, sp_executesql, kullanılarak sorgu planının yeniden kullanılmasına olanak tanıyacak şekilde sunucuda yürütülür. Toplu işlem içindeki sp_executesql yerel imleçler veya değişkenler, sp_executesql'i çağıran toplu işlem tarafından 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 ile parametreleri kullanırken, Parameters koleksiyonuna eklenen parametrelerin adları saklı yordamdaki parametre işaretleyicilerinin adlarıyla eşleşmelidir. SQL Server için Microsoft SqlClient Veri Sağlayıcısı, parametreleri SQL ifadesine veya saklı yordamına geçirmek 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)

Example

Bu örnek, Northwind örnek veritabanında SQL Server saklı yordamının nasıl çağrılacağını göstermektedir. dbo.SalesByCategory saklı yordamın adıdır ve veri türü @CategoryName olan nvarchar(15) adlı bir giriş parametresine sahiptir. Kod, prosedür sona erdiğinde bağlantının serbest bırakı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 SqlDataReader, SqlCommand komutunu yürütür ve saklı yordamdan sonuç kümesini döndürerek çıktıyı konsol penceresinde görüntüler.

Uyarı

SqlCommand ve SqlParameter nesnelerini oluşturup özellikleri ayrı ayrı ayarlamak yerine, tek bir ifadede birden fazla özelliği ayarlamak için aşırı yüklenmiş oluşturuculardan birini kullanmayı tercih edebilirsiniz.

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

Ayrıca bakınız