nhibernate : выбор статической строки из базы данных (Oracle) с помощью NamedParameter или PositionalParameter

#.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