2015-01-22 17 views
6

mogę uzyskać wynik spodziewam wpisując to w LINQPad:Jak mogę użyć podobnego operatora z parametrem w zapytaniu SQLite?

SELECT * FROM WorkTable WHERE WTName LIKE "DSD__20090410014953000%" 

(to pokazuje mi rekord, który ma wartość WTName z DSD__20090410014953000.xml ")

Ale starając się zrobić to programowo jest . dowodząc, próbując próbowałem:

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()); 
} 

... ale to powoduje, że aplikacja do katastrofy, a mój plik log mówi mi dlaczego:

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

Więc może uważa, że ​​parametr zapytania ma nazwę "wtName%" zamiast "wtName"; ale oddzielenie parametru i "cokolwiek" opertora ("%") od spacji też nie działa.

mogę iść retro/kludgy tylko przez osadzanie parametr kwerendy w ciąg tak:

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

... i robi bez parametru zapytania w ogóle, ale obawiam się, że gdybym to zrobił Troy Hunt pojawiłby się w moim domu i cepnąłby mnie poręczą, jednocześnie balansując na temat SQL Injection.

Jak mogę uzyskać dane i jednocześnie napisać bezpieczny kod?

Odpowiedz

8

symbolu wieloznacznego % należy dodać do wartości parametru, a nie do nazwy parametru

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 nie jestem pewien, czy to ma znaczenie tutaj, ale zwykle, wstawić nazwę parametru z dokładnym Stosowaną w zastępczego (@wtName)

-1

Spróbuj definiowania kwerendy tak:

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

Ale pan spróbować? Nie mogę pracować. – Steve

+0

Nie próbowałem na SQLite, ale na pewno działa na SQL Server. Skopiowałem go z istniejącego projektu. – Dragan

+0

Operator konkatenacji łańcuchów w SQLite to || więc powinieneś napisać '@wtName || '%' 'Nadal uważam, że jest to zbyt podatne na błędy i nie jest przenośne – Steve

4

najprostszym sposobem, aby to zrobić jest użycie '||'

Zastosowanie:

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

zamiast:

const string qry = "SELECT SiteNum FROM WorkTable WHERE WTName LIKE @wtName%"; 
Powiązane problemy