2012-06-19 65 views
0

我得到這個代碼的問題:與字符串參數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上的複製查詢都可以同時工作。 所以我們有一些運氣來解決問題,但我們不知道爲什麼現在它可以工作? 有什麼想法?

回答

-4

您沒有使用SQL查詢參數,如果你想SQL參數使用存儲過程

+1

-1:你是不是回答有關原因NHibernate的SQL查詢失敗。你只是提出類似「扔掉NHibrnate並編寫你自己的商店程序」。這聽起來像是一個很好的建議嗎? – themarcuz

0

即使我面臨同樣的問題在SQL,但使用TRIM列的暗示救了我的一天。因爲我在尋找很長一段時間,但無法弄清楚。

伴隨着的是,我能夠做下面的變化,以及解決我的問題:

我們使用CHAR數據類型有些查詢中使用WHERE子句中的列。這導致問題從NH​​ibernate獲取數據。我們將該列的數據類型從CHAR更改爲VARCHAR2,甚至用實際大小更新了數據,並從Where子句刪除了TRIM,TRICK WORKED !!!! :)

所以,任何一個人面臨這樣的問題,首先檢查你是否有任何與CHAR字段,然後切換到VARCHAR2。

但還有一件事你必須記住的是:如果你正在從ASP.Net Development Server運行你的應用程序,關閉它並重新運行你的應用程序。因爲如果打開Asp.Net開發服務器,並且如果您對數據類型進行任何更改,將會在您的oracle連接中刷新NOT。因此,最好關閉ASP.Net Development服務器,然後重新運行應用程序。

希望我的觀點能幫助未來的人!

問候,

SREE Harshavardhana