nhibernate:通过NamedParameter或PositionalParameter从DB(Oracle)中选择一个静态字符串

时间:2011-06-03 13:54:14

标签: .net sql oracle nhibernate

为了验证我们的oracle数据库在用Unicode提供它们时会给我们什么,我们使用一个简单的技巧:从dual中选择字符串。它在字符串上运行数据库编码。

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方言。

有没有其他方法可以使用NHibernate 2.1从我的oracle数据库中安全地选择静态字符串? Florian建议使用QueryOver,但这是3.0中的新功能......

解决方案(根据Florian和Phill的意见):

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

1 个答案:

答案 0 :(得分: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;