2011-06-03 9 views
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(); 

回答

4

這可能有點矯枉過正,但它能夠完成任務:

string text = "Let's go"; 
var result = session.QueryOver<SomeTable>() 
    .Select(Projections.Cast(NHibernateUtil.String, Projections.Constant(text))) 
    .Take(1) 
    .List<object>(); 

string s = result[0] as string; 
+0

喜弗洛裏安,我忘了說我必須處理NH 2.1(以引用的程序集的依賴),所以QueryOver不可:( – 2011-06-06 05:56:49

+1

@Sebastian - QueryOver圍繞的ICriteria API的包裝,以便您可以重新使用投影在一個正常的查詢中。 – Phill 2011-06-06 06:00:30

+0

謝謝,Phill!現在完成它,我已經將解決​​方案源代碼添加到我的問題中。 – 2011-06-06 08:45:02

相關問題