我得到這個代碼的問題:與字符串參數NHibernate的SQL查詢問題
string sql = "select distinct ruoli.c_tip_usr"
+ " from vneczx_ute_app_trn ruoli"
+ " join vnecyd_ent_prf ind"
+ " on ruoli.c_ent = ind.c_ent"
+ " where ruoli.c_app = :appCode"
+ " and ruoli.c_ute_mat = :matricola"
+ " and ind.t_des_ent = :indirizzo";
var ruoli = session.CreateSQLQuery(sql)
.SetString("appCode", Config.Configurator.Istance.ApplicationCode)
.SetString("matricola", user.Matricola)
.SetString("indirizzo", indirizzoCasella)
.List<string>();
此代碼正確執行,記錄的查詢是正確的,正確傳遞的參數進行評估......但它不」根本不會返回任何結果。 從調試控制檯複製查詢並直接在Oracle客戶端應用程序(SQL Developer)中執行它,它會得到2個結果(我期望結果是正確的)。
我發現問題出在最後一個參數indirizzo
,應該取決於它包含一個特殊字符@
(indirizzo
是一個電子郵件地址)的事實。
所以我結束了使用此解決方案:
string sql = "select distinct ruoli.c_tip_usr"
+ " from vneczx_ute_app_trn ruoli"
+ " join vnecyd_ent_prf ind"
+ " on ruoli.c_ent = ind.c_ent"
+ " where ruoli.c_app = :appCode"
+ " and ruoli.c_ute_mat = :matricola"
+ " and ind.t_des_ent = '" + indirizzoCasella + "'";
var ruoli = session.CreateSQLQuery(sql)
.SetString("appCode", Config.Configurator.Istance.ApplicationCode)
.SetString("matricola", user.Matricola)
.List<string>();
但它給我的刺激!查詢中的參數是不是應該專門處理這種情況,並因此使用特殊字符處理它們自己的情況,等等? 爲什麼在這裏字符串連接更適合參數查詢? 是不是有辦法強制NHibernate引擎轉義一些特殊的字符?
更新:
我發現瞭如何解決這個特定的問題:usign在誰撫養問題領域trim
命令,問題消失。 我的SQL字符串所以最後一行是現在:
+ " and trim(ind.t_des_ent) = :indirizzo";
我不明白爲什麼它解決了思考的問題。不是字段,也不是變量包含空字符,並且SQL Developer上的複製查詢都可以同時工作。 所以我們有一些運氣來解決問題,但我們不知道爲什麼現在它可以工作? 有什麼想法?
-1:你是不是回答有關原因NHibernate的SQL查詢失敗。你只是提出類似「扔掉NHibrnate並編寫你自己的商店程序」。這聽起來像是一個很好的建議嗎? – themarcuz