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 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 Value
Parameter
veya DbType
nesnenin türünden Parameter
çıkarılır. Aşağıdaki tabloda, değer veya belirtilen DbType
olarak 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 | 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 çıkarılma SqlDbType desteklenmez. | Char | Char | Bayt | |
DateTime | DateTime | DateTime | DBTimeStamp | 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 | Saat | SQL Server 2008'de saat. TimeSpan'dan çıkarım SqlDbType , SQL Server 2008'den önceki SQL Server sürümlerinde desteklenmez. | DBTime | Saat | DateTime |
UInt16 | UInt16 | UInt16'dan çıkarım SqlDbType desteklenmez. | UnsignedSmallInt | Int | UInt16 |
UInt32 | UInt32 | UInt32'den çıkarım SqlDbType desteklenmez. | UnsignedInt | BigInt | UInt32 |
UInt64 | UInt64 | UInt64'ten çıkarım SqlDbType desteklenmez. | UnsignedBigInt | 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 | |
Saat | SQL Server 2008'de saat. Zaman'dan çıkarım SqlDbType , SQL Server 2008'den önceki SQL Server sürümlerinde desteklenmez. | DBTime | Saat | 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ı, DeriveParameters
saklı 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, kullanılarak sunucuda sp_executesql
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 çağıran sp_executesql
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 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ı @CustomerID
bir parametre kullanılarak tanımlanır. Kodunuz saklı yordamı yürüttüğünde, adlı @CustomerID
bir 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 OleDbCommand OdbcCommandile 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;