SqlQueryAttribute, Firebird, insert into
От: Ed.ward Россия  
Дата: 02.06.11 19:45
Оценка:
Добрый день, господа.

База Firebird — eсть такая процедура
create procedure Entity_Ins (
    IN_ID integer,
    Title char(50))
returns ( ID integer, RETURN_VALUE integer)
as
begin
    insert into entity (
        id,
        Title,
        revision)
      values (
        gen_id( gen_entity_id, 1 ),
        :Title,
        0)
        returning id into :id;
    return_value = row_count;
      suspend;        
end^


И вот такой метод
[ScalarSource(ScalarSourceType.ReturnValue)]
public abstract int Insert( [Direction.Output( "Id" )] Entity e );

Всё работает прекрасно.

Но вот решил я отказаться от хранимой процедуры и перейти на использование SqlQueryAttribute
Прикрутил триггер для генерация значения для поля Id при вставке и получил вот это
[SqlQuery( @"insert into entity( title ) values ( @Title )")]
public abstract int Insert( Entity e );


Я перерыл весь интернет, но так и не смог найти как же мне вернуть Id в соответствующее свойство класса, и как сделать чтобы из метода возвращалось количество вставленных строк.
То, что в процедуре реализовывалось через
returning id into :id;
return_value = row_count;


заранее спасибо

Ed.ward
Re: SqlQueryAttribute, Firebird, insert into
От: IT Россия linq2db.com
Дата: 02.06.11 20:40
Оценка:
Здравствуйте, Ed.ward, Вы писали:

EW>Я перерыл весь интернет, но так и не смог найти как же мне вернуть Id в соответствующее свойство класса, и как сделать чтобы из метода возвращалось количество вставленных строк.


Вообще-то, это взаимоисключающие вещи. Если возвращается Id в единственном числе, то очевидно, что row-count должен быть 1. Или я чего-то не понимаю.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: SqlQueryAttribute, Firebird, insert into
От: Ed.ward Россия  
Дата: 02.06.11 21:01
Оценка: 43 (1)
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Ed.ward, Вы писали:


EW>>Я перерыл весь интернет, но так и не смог найти как же мне вернуть Id в соответствующее свойство класса, и как сделать чтобы из метода возвращалось количество вставленных строк.


IT>Вообще-то, это взаимоисключающие вещи. Если возвращается Id в единственном числе, то очевидно, что row-count должен быть 1. Или я чего-то не понимаю.

row_count — это был задел на будущее, для оптимистической блокировки.

Вобщем, если долго мучаться, что-нибудь получится — человеческий разум победил здравый смысл
Надо использовать не
returning id, revision into @Id, @Revision

а просто
returning id, revision


Для истории приведу решение
[ScalarSource(ScalarSourceType.AffectedRows)] // это чтобы метод возвращал количество вставленных строк (совсем забыл про этот атрибут)
[SqlQuery( @"insert into entity( title ) values ( @Title ) returning id, revision")] // revision это для оптимистической блокировки
public abstract int Insert( [Direction.Output("Id", "Revision")] Entity entity );

[ScalarSource(ScalarSourceType.AffectedRows)] // метод вернёт количество изменённых строк, оно может быть равно нулю
[SqlQuery(@"update entity set title = @Title where (id = @Id) and (revision = @Revision) returning id, revision")]
public abstract int Update( [Direction.InputOutput( "Id", "Revision" )] Entity entity );


Ed.ward
Re[3]: SqlQueryAttribute, Firebird, insert into
От: IT Россия linq2db.com
Дата: 02.06.11 22:21
Оценка:
Здравствуйте, Ed.ward, Вы писали:

IT>>Вообще-то, это взаимоисключающие вещи. Если возвращается Id в единственном числе, то очевидно, что row-count должен быть 1. Или я чего-то не понимаю.

EW>row_count — это был задел на будущее, для оптимистической блокировки.

Может быть в этом случае логичнее сделать возвращаемое значение методов bool?
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: SqlQueryAttribute, Firebird, insert into
От: Ed.ward Россия  
Дата: 03.06.11 09:19
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Ed.ward, Вы писали:


IT>>>Вообще-то, это взаимоисключающие вещи. Если возвращается Id в единственном числе, то очевидно, что row-count должен быть 1. Или я чего-то не понимаю.

EW>>row_count — это был задел на будущее, для оптимистической блокировки.

IT>Может быть в этом случае логичнее сделать возвращаемое значение методов bool?


Логичнее, но как?

Ed.ward
Re[5]: SqlQueryAttribute, Firebird, insert into
От: IT Россия linq2db.com
Дата: 03.06.11 13:41
Оценка: 12 (1)
Здравствуйте, Ed.ward, Вы писали:

IT>>Может быть в этом случае логичнее сделать возвращаемое значение методов bool?

EW>Логичнее, но как?

Так не работает?

[ScalarSource(ScalarSourceType.AffectedRows)] // это чтобы метод возвращал количество вставленных строк (совсем забыл про этот атрибут)
[SqlQuery( @"insert into entity( title ) values ( @Title ) returning id, revision")] // revision это для оптимистической блокировки
public abstract bool Insert( [Direction.Output("Id", "Revision")] Entity entity );
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: SqlQueryAttribute, Firebird, insert into
От: Ed.ward Россия  
Дата: 03.06.11 20:56
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Ed.ward, Вы писали:


IT>Так не работает?


Чего-то я туплю, работает конечно

А вот ещё вопрос, раз уж нашлась отзывчивая душа

У меня есть базовый интерфейс для всех классов доступа к данным. Я попробовал навесить
[ScalarSource(ScalarSourceType.AffectedRows)]
прямо на метод интерфейса, чтобы значит не навешивать его в каждой реализации.
interface IDalc<T>
{
  [ScalarSource(ScalarSourceType.AffectedRows)]
  bool Update(T entity);
}


а в реализации
class abstract EntityDalc : IDalc<Entity>
{
  [SqlQuery(...)]
  public abstract bool Update(T entity);
}


Но создатель типа не видит похоже атрибут из интерфейса.
Это можно как-то поправить?

спасибо

Ed.ward
Re[7]: SqlQueryAttribute, Firebird, insert into
От: IT Россия linq2db.com
Дата: 04.06.11 04:50
Оценка:
Здравствуйте, Ed.ward, Вы писали:

EW>Но создатель типа не видит похоже атрибут из интерфейса.

EW>Это можно как-то поправить?

Наверно как-то можно, но надо править.
Если нам не помогут, то мы тоже никого не пощадим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.