2013-03-19 35 views
7

Tôi đang cố gắng tham số hóa truy vấn SQL thô cho một từ đồng nghĩa Oracle (không phải thực thể) trong EF 4 và tôi đang gặp một số vấn đề. Hiện tại tôi đang làm một cái gì đó giống như mã bên dưới, dựa trên một số ví dụ mà tôi đã thấy:Tham số hóa truy vấn Oracle SQL thô trong Entity Framework

string term="foo"; 
OracleParameter p = new OracleParameter("@param1", term); 
object[] parameters = new object[] { p }; 
var model = db.Database.SqlQuery<ProjectTask>("SELECT * FROM (SELECT * FROM web_project_task_vw WHERE project_num like '%@param1%') WHERE rownum<=100", parameters).ToList(); 

Chạy điều này không trả về bất kỳ kết quả nào. Nếu tôi thay thế thông số bằng một cái gì đó như

"SELECT * FROM web_project_task_vw WHERE project_num like '%"+term+"%'" 

nó trả về kết quả tôi mong đợi, nhưng điều này rõ ràng là một nguy cơ tiêm SQL.

Bất cứ ai có thể chỉ cho tôi đúng hướng cho cách các thông số được cho là hoạt động trong EF 4 cho Oracle DB không?

Cảm ơn.

+0

Tôi nghĩ Oracle tên tham số bắt đầu với: thay vì @? – RogerN

Trả lời

1

p của bạn có thể có tên thông số không chính xác; tên phải là param1, không phải là @param1. Truy vấn của bạn cũng không chính xác; thay thế '%@param1%' bằng '%:param1%'.

6

Trước tiên, như Mohammed đã viết, bạn cần đặt tiền tố tham số bằng ':', nhưng không phải khi bạn xác định tham số, chỉ trong truy vấn. Thứ hai, hiện tại bạn đang tìm kiếm không cho giá trị của thông số mà là các chuỗi chứa chuỗi @param1. Vì vậy, bao quanh giá trị của tham số bằng% và bạn sẽ nhận được kết quả.

Vì vậy, nó sẽ giống như thế này:

string term="foo"; 
OracleParameter p = new OracleParameter("param1", term); 
object[] parameters = new object[] { p }; 
var model = db.Database.SqlQuery<ProjectTask>("SELECT * FROM (SELECT * FROM web_project_task_vw WHERE project_num like '%'||:param1||'%') WHERE rownum<=100", parameters).ToList(); 
+0

Hoạt động trong EF6. –

Các vấn đề liên quan