0
爲了驗證我們的oracle數據庫在使用Unicode提供它時會給我們什麼,我們使用一個簡單的技巧:從dual中選擇字符串。這將通過字符串運行數據庫編碼。nhibernate:通過NamedParameter或PositionalParameter從DB(Oracle)中選擇一個靜態字符串
select 'Let’s Go' from dual
現在我想用NHibernate實現同樣的事情。只是這樣做:
string.Format("select '{0}' from dual", text);
離開我的代碼脆性和開放的SQL注入,所以我寧願請執行下列操作之一:
//Version 1 : Named param
IQuery q = this.Session.CreateSQLQuery("SELECT :staticstring from dual");
q.SetString(":staticstring", text);
// Version 2 : positional param
IQuery q = this.Session.CreateSQLQuery("SELECT ? from dual");
q.SetString(0, text);
雙方的上述方式失敗,帕拉姆不能分配。我認爲這是在'from'子句之前的任何地方放置參數的問題,但是當我嘗試沒有NH時,結果變得有效。順便說一句,我嘗試了Oracle9和10方言。
是否有任何其他方式可以安全地從我的oracle數據庫使用NHibernate 2.1中選擇靜態字符串?弗洛裏安建議QueryOver,但在3.0中的新功能......
SOLUTION(基於弗洛裏安之和菲爾的輸入):
DetachedCriteria crit = DetachedCriteria.For<Freetext>()
.SetProjection(Projections.Cast(NHibernateUtil.String,Projections.Constant(text)))
.SetMaxResults(1);
string dbString = crit.GetExecutableCriteria(this.Session).List <object>()[0].ToString();
喜弗洛裏安,我忘了說我必須處理NH 2.1(以引用的程序集的依賴),所以QueryOver不可:( – 2011-06-06 05:56:49
@Sebastian - QueryOver圍繞的ICriteria API的包裝,以便您可以重新使用投影在一個正常的查詢中。 – Phill 2011-06-06 06:00:30
謝謝,Phill!現在完成它,我已經將解決方案源代碼添加到我的問題中。 – 2011-06-06 08:45:02