2015-01-22 13 views
6

Ben LINQPad bu girerek bekliyoruz sonucu alabilirsiniz: Like Operator'unu bir SQLite sorgusunda bir Parametre ile nasıl kullanabilirim?

SELECT * FROM WorkTable WHERE WTName LIKE "DSD__20090410014953000%" 

(bana "DSD__20090410014953000.xml bir WTName değerine sahip kaydını gösterir)

Ama bu programlı olduğunu yapmaya çalışıyor . çalışırken kanıtlayan denedim:

const string qry = "SELECT SiteNum FROM WorkTable WHERE WTName LIKE @wtName%"; 
using (SQLiteConnection con = new SQLiteConnection(HHSUtils.GetDBConnection())) 
{ 
    con.Open(); 
    SQLiteCommand cmd = new SQLiteCommand(qry, con); 
    cmd.Parameters.Add(new SQLiteParameter("wtName", tableName)); 
    siteNum = Convert.ToInt32(cmd.ExecuteScalar()); 
} 

... ama uygulamanın kilitlenmesine neden olur ve benim günlük dosyası söylüyor neden:

Message: From application-wide exception handler: System.Data.SQLite.SQLiteException: SQL logic error or missing database 
near "%": syntax error 

Belki de, sorgu parametresinin "wtName" yerine "wtName%" olarak adlandırıldığını düşünür; ama parametreyi ve "her ne" operörü ("%") bir boşlukla ayırmak da işe yaramıyor.

const string qry = String.Format("SELECT SiteNum FROM WorkTable WHERE WTName LIKE {0}%", tableName); 

... ve tamamen sorgu parametresi olmadan yapıyor, ama ben Troy Hunt yapsam korkuyorum:

Sadece şöyle dizeye sorgu parametresi gömerek kludgy Retro/gidebiliriz Benim evimde ortaya çıkar ve SQL Enjeksiyon hakkında korkuluk yaparken beni bir çarşaf ile defile.

Verilerimi nasıl alabilirim ve eş zamanlı olarak güvenli kod yazabilirim?

cevap

8

joker % genellikle, ben tam ile parametre adını eklemek değil, parametre adı

const string qry = "SELECT SiteNum FROM WorkTable WHERE WTName LIKE @wtName"; 
using (SQLiteConnection con = new SQLiteConnection(HHSUtils.GetDBConnection())) 
{ 
    con.Open(); 
    SQLiteCommand cmd = new SQLiteCommand(qry, con); 
    cmd.Parameters.Add(new SQLiteParameter("@wtName", tableName + "%")); 
    siteNum = Convert.ToInt32(cmd.ExecuteScalar()); 
} 

için, parametre değerine ilave Ve, burada bir önemi var mı emin değilim ama edilmelidir

-1

böyle sorguyu tanımlayan deneyin tutucu (@wtName) kullanılan ad: bunu yapmak için

const string qry = "SELECT SiteNum FROM WorkTable WHERE WTName LIKE @wtName + '%'"; 
+1

Ama bu çalıştın? Çalışamayız. – Steve

+0

SQLite denemedim, ancak emin SQL Server üzerinde çalışır. Onu mevcut projeden kopyaladım. – Dragan

+0

SQLite dizeleri için birleştirme operatörü || bu yüzden yazmalısınız '@wtName || '%' 'Hala bunun hataya eğilimli olduğunu düşünüyorum ve taşınabilir değil – Steve

4

En kolay yolu kullanmaktır '||'

Kullanım:

const string qry = "SELECT SiteNum FROM WorkTable WHERE WTName LIKE @wtName || '%' "; 

Yerine:

const string qry = "SELECT SiteNum FROM WorkTable WHERE WTName LIKE @wtName%"; 
İlgili konular