2015-01-22 31 views
6

tôi có thể nhận được kết quả tôi mong đợi bằng cách nhập này trong LINQPad:Làm cách nào để sử dụng toán tử Like với tham số trong truy vấn SQLite?

SELECT * FROM WorkTable WHERE WTName LIKE "DSD__20090410014953000%" 

(nó chỉ cho tôi các bản ghi trong đó có một giá trị WTName của DSD__20090410014953000.xml ")

Nhưng cố gắng để làm điều này lập trình là . minh cố gắng tôi đã cố gắng:

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

... nhưng nó gây ra các ứng dụng để sụp đổ, và tập tin đăng nhập của tôi nói với tôi lý do tại sao:

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

Vì vậy, có thể nó cho rằng tham số truy vấn được đặt tên là "wtName%" thay vì "wtName"; nhưng tách các tham số và "bất cứ điều gì" opertor ("%") với một không gian không hoạt động, một trong hai.

tôi có thể đi retro/kludgy bằng cách chỉ cần nhúng các tham số truy vấn vào chuỗi như vậy:

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

... và làm mà không có tham số truy vấn hoàn toàn, nhưng tôi sợ nếu tôi đã làm điều đó Troy Hunt sẽ xuất hiện ở nhà tôi và tống tôi vào một lan can trong khi lan can về SQL Injection.

Làm cách nào để có được dữ liệu và đồng thời viết mã an toàn?

Trả lời

8

Các ký tự đại diện % nên được thêm vào giá trị tham số, không để tên tham số

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

Và, tôi không chắc chắn nếu vấn đề ở đây, nhưng, thường, tôi chèn tên tham số với chính xác tên được sử dụng trong placeholder (@wtName)

-1

Cố gắng xác định truy vấn như thế này:

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

Nhưng bạn thử loại này? Không thể làm việc. – Steve

+0

Không thử trên SQLite nhưng nó hoạt động trên SQL Server chắc chắn. Tôi đã sao chép nó từ dự án hiện tại. – Dragan

+0

Toán tử nối cho chuỗi trong SQLite là || vì vậy bạn nên viết '@wtName || '%' 'Tuy nhiên tôi tin rằng đây là quá dễ bị lỗi và không di động – Steve

4

cách dễ nhất để làm điều này là sử dụng '||'

Sử dụng:

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

Thay vào đó Of:

const string qry = "SELECT SiteNum FROM WorkTable WHERE WTName LIKE @wtName%"; 
Các vấn đề liên quan