İfadelerde parametreler kullanma

Adobe AIR 1.0 ve üstü

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;