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 ve 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 Add yöntemi DbParameterCollection çağrılarak öğesine eklenerek DbParameterCollection oluşturulabilir. yöntemi, Add veri sağlayıcısına bağlı olarak oluşturucu bağımsız değişkenlerini veya 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ü belirtilmesi, değeri Parameter veri kaynağına geçirmeden önce değerini .NET Framework veri sağlayıcısı türüne dönüştürür. Ayrıca, nesnesinin Parameter özelliğini Parameter belirli DbTypebir olarak ayarlayarak DbType genel bir şekilde de türünü belirtebilirsiniz.

Bir Parameter nesnenin .NET Framework veri sağlayıcısı türü, nesnenin .NET Framework türünden ValueParameter veya DbType nesnenin türünden Parameter çıkarılır. Aşağıdaki tabloda, değer veya belirtilen DbTypeolarak Parameter geçirilen nesneye göre çıkarılmış Parameter tür gösterilmektedir.

.NET Framework türü Dbtype Sqldbtype Oledbtype Odbctype Oracletype
Boolean Boolean Bit Boolean Bit Bayt
Byte Bayt Tinyint Unsignedtinyınt 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 çıkarılma SqlDbType desteklenmez. Char Char Bayt
DateTime DateTime DateTime Dbtımestamp DateTime DateTime
DateTimeOffset DateTimeOffset SQL Server 2008'de DateTimeOffset. DateTimeOffset'ten çıkarım SqlDbType , SQL Server 2008'den önceki SQL Server sürümlerinde desteklenmez. DateTime
Decimal Decimal Ondalık Ondalık Sayısal Sayı
Double Çift Satışa Arz Çift Çift Çift
Single Tekli Gerçek sayı Tekli Gerçek sayı Satışa Arz
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 Object Varyant Varyant Nesneden OdbcType çıkarılma desteklenmiyor. Blob
String String 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 öğesini açıkça ayarlayın SqlDbType. VarWChar Nvarchar Nvarchar
TimeSpan Zaman SQL Server 2008'de saat. TimeSpan'dan çıkarım SqlDbType , SQL Server 2008'den önceki SQL Server sürümlerinde desteklenmez. DBTime Zaman DateTime
UInt16 UInt16 UInt16'dan çıkarım SqlDbType desteklenmez. Unsignedsmallınt Int UInt16
UInt32 UInt32 UInt32'den çıkarım SqlDbType desteklenmez. Unsignedınt BigInt UInt32
UInt64 UInt64 UInt64'ten çıkarım SqlDbType desteklenmez. Unsignedbigınt Sayısal Sayı
AnsiString Varchar Varchar Varchar Varchar
AnsiStringFixedLength Char Char Char Char
Para birimi Money Para birimi 'den Currency çıkarılma OdbcType desteklenmez. Sayı
Tarih SQL Server 2008'de tarih. SqlDbType Sql Server'ın SQL Server 2008'den önceki sürümlerinde from tarih çıkarması desteklenmez. DBDate Tarih DateTime
SByte SByte'ten çıkarım SqlDbType desteklenmez. Tinyint SByte'ten çıkarım OdbcType desteklenmez. SByte
StringFixedLength Nchar Wchar Nchar Nchar
Zaman SQL Server 2008'de saat. Zaman'dan çıkarım SqlDbType , SQL Server 2008'den önceki SQL Server sürümlerinde desteklenmez. DBTime Zaman DateTime
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)Nothing değil null belirtmelisinizDBNull. 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, sınıfı kullanılarak DbCommandBuilder 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. Komutun mevcut parametre bilgilerinin üzerine yazıldığını DeriveParameters 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. Saklı yordam adı, ardından parametre bağımsız değişkenleri sql deyimi olarak geçirilerek çağrılsa da, ADO.NET DbCommand nesnesinin koleksiyonunu kullanarak Parameters saklı yordam parametrelerini daha açık bir şekilde tanımlamanıza ve çıkış parametrelerine ve dönüş değerlerine erişmenize olanak tanır.

Not

Parametreli deyimler, sorgu planının yeniden kullanılmasına olanak tanıyan kullanılarak sp_executesql, sunucuda yürütülür. Toplu iş içindeki sp_executesql yerel imleçler veya değişkenler çağıran sp_executesqltoplu 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 ile SqlCommand parametreleri kullanırken, koleksiyona Parameters eklenen parametrelerin adları saklı yordamdaki parametre işaretleyicilerinin adlarıyla eşleşmelidir. SQL Server için .NET Framework Veri Sağlayıcısı, sql deyimine veya saklı yordama parametre 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 saklı CustOrderHist yordam adlı @CustomerIDbir 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 örnekte, örnek veritabanında SQL Server saklı yordamının nasıl çağrılacakları gösterilmektedir Northwind . Saklı yordamın adıdır dbo.SalesByCategory ve veri türü olan adlı @CategoryName bir giriş parametresine nvarchar(15)sahiptir. Kod, yordam sona erdiğinde bağlantının atılması için bir using bloğu içinde yeni SqlConnection bir oluşturur. SqlCommand ve SqlParameter nesneleri oluşturulur ve özellikleri ayarlanır. a SqlDataReader komutunu yürütür SqlCommand ve saklı yordamdan sonuç kümesini döndürür ve çıkışı konsol penceresinde görüntüler.

Not

Ve nesneleri oluşturmak SqlCommand ve SqlParameter sonra özellikleri ayrı deyimlerde ayarlamak yerine, tek bir deyimde birden çok özellik ayarlamak için aşırı yüklenmiş oluşturuculardan birini kullanmayı seçebilirsiniz.

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("{0}: {1:C}", reader[0], reader[1]);
                }
            }
            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

veya OleDbCommandOdbcCommandile parametreleri kullanırken, koleksiyona Parameters eklenen parametrelerin sırası saklı yordamınızda tanımlanan parametrelerin sırasıyla eşleşmelidir. ODBC için OLE DB ve .NET Framework Veri Sağlayıcısı için .NET Framework Veri Sağlayıcısı, saklı yordamdaki parametreleri yer tutucu 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, nesnelerin koleksiyona Parameters eklenme sırası Parameter doğrudan öğesinin konumuna karşılık gelir. parametresi 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.