Чтобы проверить, что наша база данных oracle даст нам, когда мы добавим ее в Unicode, мы используем простой прием: выбор строки из двойного.Это запускает кодирование базы данных над строкой.
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. 10.
Есть ли другой способ безопасно выбрать статическую строку из базы данных оракула с помощью NHibernate 2.1?Флориан предложил QueryOver, но это новое в версии 3.0 ...
РЕШЕНИЕ (Основано на материалах Флориана и Фила):
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();