SQL ifadesi parametresi kullanma yeniden kullanılabilir bir SQL ifadesi oluşturmanızı sağlar. İfade parametreleri kullandığınızda, ifadenin içindeki değerler değişebilir (bir
INSERT
ifadesine eklenen değerler gibi), ancak temel ifade metni aynı kalır. Sonuç olarak, parametre kullanmak uygulamanın kodlanmasını kolaylaştırmasının yanı sıra, performans açısından da fayda sağlar.
İfade parametrelerini anlama
Bir uygulama genellikle tek bir SQL ifadesini bir uygulamada küçük değişimlerle birçok kez kullanır. Örneğin, kullanıcının veritabanına yeni stok kalemleri ekleyebildiği bir stok izleme uygulaması düşünün. Veritabanına yeni bir stok kalemi ekleyen uygulama kodu, veriyi veritabanına gerçekten ekleyen bir SQL
INSERT
ifadesini yürütür. Ancak, ifade her yürütüldüğünde, küçük bir değişime uğrar. Özellikle, tabloya eklenen gerçek değerler farklıdır, çünkü bu değerler eklenen stok kalemine özgüdür.
İfadede farklı değerlerle birçok kez kullanılan bir SQL ifadenizin olduğu durumlarda en iyi yaklaşım, SQL metninde değişmez değerler yerine parametreler içeren bir SQL ifadesi kullanmaktır. Bir parametre, ifade her yürütüldüğünde geçerli bir değerle değiştirilen ifade metnindeki yer tutucudur. SQL ifadesinde parametreler kullanmak için,
SQLStatement
örneğini her zamanki gibi oluşturun.
text
özelliğine atanan geçerli SQL ifadesi için değişmez değerler yerine parametre yer tutucuları kullanın. SQLStatement örneğinin
parameters
özelliğindeki öğenin değerini ayarlayarak, her parametreye ilişkin değeri tanımlayabilirsiniz.
Parametreler
özelliği ilişkilendirici bir dizidir. Bu nedenle aşağıdaki sözdizimini kullanarak belirli bir değer ayarlarsınız:
statement.parameters[parameter_identifier] = value;
Parameter_identifier
, adlandırılmış bir parametre kullanıyorsanız bir dize, adlandırılmamış bir parametre kullanıyorsanız bir tam sayı dizinidir.
Adlandırılmış parametreleri kullanma
Parametre, adlandırılmış bir parametre olabilir. Adlandırılmış bir parametre, veritabanının parametre değerini ifade metnindeki yer tutucu konumuna eşlemek için kullandığı belirli bir ada sahiptir. Bir parametre adı, aşağıdaki örneklerdeki gibi arkasından bir ad gelen “:” veya “@” karakterinden oluşur:
:itemName
@firstName
Aşağıdaki kod listelemesi, adlandırılmış parametrelerin kullanımını gösterir:
var sql:String =
"INSERT INTO inventoryItems (name, productCode)" +
"VALUES (:name, :productCode)";
var addItemStmt:SQLStatement = new SQLStatement();
addItemStmt.sqlConnection = conn;
addItemStmt.text = sql;
// set parameter values
addItemStmt.parameters[":name"] = "Item name";
addItemStmt.parameters[":productCode"] = "12345";
addItemStmt.execute();
Adlandırılmamış parametreleri kullanma
Adlandırılmış parametre kullanmaya alternatif olarak, adlandırılmamış parametreler de kullanabilirsiniz. Adlandırılmamış bir parametre kullanmak için, bir SQL ifadesindeki parametreyi “?” kullanarak belirtirsiniz karakter. İfadedeki parametrelerin sırasına göre, ilk parametrenin dizin 0'la başlayacağı şekilde her parametreye sayısal bir dizin atanmıştır. Aşağıdaki örnek, önceki örneğin adlandırılmamış parametre kullanılan versiyonunu gösterir:
var sql:String =
"INSERT INTO inventoryItems (name, productCode)" +
"VALUES (?, ?)";
var addItemStmt:SQLStatement = new SQLStatement();
addItemStmt.sqlConnection = conn;
addItemStmt.text = sql;
// set parameter values
addItemStmt.parameters[0] = "Item name";
addItemStmt.parameters[1] = "12345";
addItemStmt.execute();
Parametre kullanmanın faydaları
Bir SQL ifadesinde parametreler kullanmak, çeşitli faydalar sağlar:
-
Daha iyi performans
-
Parametreler kullanan bir SQLStatement örneği, her yürütüldüğünde dinamik olarak SQL metni oluşturan bir örneğe göre daha verimli çalışır. Performans iyileştirmesi, ifadenin tek bir kez hazırlanmış ve SQL ifadesinin yeniden derlenmesine ihtiyaç duymadan farklı parametre değerleri kullanarak birçok kez yürütülebiliyor olmasından kaynaklanmaktadır.
-
Açık veri türleme
-
Parametreler, SQL ifadesi oluşturulduğunda bilinmeyen değerlerin türlenmiş değişikliğine izin vermek için kullanılır. Parametre kullanımı, veritabanına iletilen bir değer için depo sınıfını garanti etmenin tek yoludur. Parametreler kullanılmadığında, çalışma zamanı tüm değerleri metin temsillerinden ilişkili sütunun tür yakınlığına dayanan bir depo sınıfına dönüştürmeye çalışır.
Depolama sınıfları ve sütun benzerliğiyle ilgili daha fazla bilgi için bkz.
Veri türü desteği
.
-
Daha fazla güvenlik
-
Parametrelerin kullanılması, SQL yerleştirme saldırısı olarak bilinen kötü amaçlı bir tekniğin engellenmesine yardımcı olur. Kullanıcı, SQL yerleştirme saldırısında kullanıcı tarafından erişilebilir bir konuma SQL kodu girer (örneğin, veri giriş alanı). Uygulama kodu SQL ifadesini doğrudan kullanıcı girdisini SQL metnine bitiştirerek oluşturuyorsa, kullanıcı taradından girilen SQL kodu veritabanına karşı yürütülür. Aşağıdaki listeleme, kullanıcı girdisinin SQL metnine bitiştirilmesinin bir örneğini gösterir.
Bu tekniği kullanmayın
:
// assume the variables "username" and "password"
// contain user-entered data
var sql:String =
"SELECT userId " +
"FROM users " +
"WHERE username = '" + username + "' " +
" AND password = '" + password + "'";
var statement:SQLStatement = new SQLStatement();
statement.text = sql;
Kullanıcı tarafından girilen değerleri ifade metnine bitiştirmek yerine ifade parametrelerinin kullanılması, SQL yerleştirme saldırısını engeller. Parametre değerleri değişmez ifade metninin bir parçası olmaktansa, açıkça değiştirilmiş değerler olarak değerlendirildiğinden, SQL yerleştirme gerçekleşemez. Aşağıdaki, bir önceki listelemenin önerilen bir alternatifidir:
// assume the variables "username" and "password"
// contain user-entered data
var sql:String =
"SELECT userId " +
"FROM users " +
"WHERE username = :username " +
" AND password = :password";
var statement:SQLStatement = new SQLStatement();
statement.text = sql;
// set parameter values
statement.parameters[":username"] = username;
statement.parameters[":password"] = password;
|
|
|