#.net #sql #oracle #nhibernate
#.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.
Есть ли какой-либо другой способ безопасно выбрать статическую строку из моей базы данных Oracle, используя 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();
Ответ №1:
Это может быть немного излишним, но оно выполняет свою работу:
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;
Комментарии:
1. Привет, Флориан, я забыл сказать, что мне приходится иметь дело с NH 2.1 (зависимости в ссылочных сборках), поэтому выполнение запросов недоступно : (
2. @Sebastian — QueryOver — это оболочка ICriteria API, позволяющая повторно использовать проекцию в обычном запросе.
3. спасибо, Phill! Сделав это сейчас, я добавил исходный код решения к своему вопросу.
4. Прямо сейчас я натыкаюсь на длинные строки, поскольку предложенная вами здесь (для oracle) SQLified в : cast( :p0 как NVARCHAR2(255)) — это означает, что любая строка длиннее 255 букв будет обрезана. Есть еще идеи?
5. @Sebastian Edelmeier Вы могли бы попробовать
NHibernate.Type.TypeFactory.GetStringType(2000)
вместоNHibernateUtil.String