2013-03-19 17 views
7

Próbuję sparametryzować surowe zapytanie SQL dla synonimu Oracle (bez encji) w EF 4 i mam pewne problemy. Obecnie robię coś takiego jak poniższy kod, na podstawie kilku przykładów, które widziałem:Parametryzowanie surowego zapytania Oracle SQL w 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(); 

Uruchomienie tego nie zwróci żadnych wyników. Jeśli zastąpię parametr z czymś podobnym do

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

to zwraca oczekiwane wyniki, ale jest to oczywiście ryzyko wstrzyknięcia SQL.

Czy ktoś może wskazać mi właściwy kierunek, w jaki sposób parametry powinny działać w EF 4 dla Oracle DB?

Dzięki.

+0

Myślałem nazwy parametrów Oracle rozpoczął: zamiast @? – RogerN

Odpowiedz

1

Twoja p może mieć niepoprawną nazwę parametru; nazwa powinna być param1, a nie @param1. Twoje zapytanie również jest nieprawidłowe; zamień '%@param1%' na '%:param1%'.

6

Po pierwsze, jak pisał Mohammed, musisz poprzedzić parametr ":", ale nie tak, jak go zdefiniowałeś, tylko w zapytaniu. Po drugie, obecnie szukasz nie wartości parametru, lecz łańcuchy zawierające ciąg @param1. Tak więc ustaw wartość parametru za pomocą% i powinieneś otrzymać wynik.

Więc powinno to wyglądać mniej więcej tak:

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

Działa również w EF6. –

Powiązane problemy