2013-03-19 97 views
7

我想參數化EF 4中的一個Oracle同義詞(非實體)的原始SQL查詢,我遇到了一些問題。目前我正在做類似下面的代碼,基於我看到的一些示例:參數化實體框架中的原始Oracle SQL查詢

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

運行此操作不會返回任何結果。如果我的東西來替換參數一樣

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

返回我所期望的結果,但是這顯然是一個SQL注入風險。

任何人都可以在正確的方向上指出我的參數應該如何在EF 4中爲Oracle DB工作?

謝謝。

+0

我認爲甲骨文的參數名稱開始的:不是@? – RogerN 2013-03-19 20:15:42

回答

1

您的p可能有不正確的參數名稱;名稱應該是param1,而不是@param1。你的查詢也是不正確的;用'%:param1%'代替'%@param1%'

6

首先,就像穆罕默德寫的,你需要在參數前加上':',但不是像你定義的那樣,只是在查詢中。 其次,您當前搜索的不是參數的值,而是包含字符串@param1的字符串。所以用%來包圍參數的值,你應該得到一個結果。

因此,它應該是這個樣子:

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

也適用於EF6。 – 2017-03-03 15:57:19