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 в соответствующее свойство класса, и как сделать чтобы из метода возвращалось количество вставленных строк.
То, что в процедуре реализовывалось через
Здравствуйте, Ed.ward, Вы писали:
EW>Я перерыл весь интернет, но так и не смог найти как же мне вернуть Id в соответствующее свойство класса, и как сделать чтобы из метода возвращалось количество вставленных строк.
Вообще-то, это взаимоисключающие вещи. Если возвращается Id в единственном числе, то очевидно, что row-count должен быть 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, Вы писали:
IT>>Вообще-то, это взаимоисключающие вещи. Если возвращается Id в единственном числе, то очевидно, что row-count должен быть 1. Или я чего-то не понимаю. EW>row_count — это был задел на будущее, для оптимистической блокировки.
Может быть в этом случае логичнее сделать возвращаемое значение методов bool?
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Ed.ward, Вы писали:
IT>>>Вообще-то, это взаимоисключающие вещи. Если возвращается Id в единственном числе, то очевидно, что row-count должен быть 1. Или я чего-то не понимаю. EW>>row_count — это был задел на будущее, для оптимистической блокировки.
IT>Может быть в этом случае логичнее сделать возвращаемое значение методов bool?
Здравствуйте, Ed.ward, Вы писали:
IT>>Может быть в этом случае логичнее сделать возвращаемое значение методов bool? EW>Логичнее, но как?
Так не работает?
[ScalarSource(ScalarSourceType.AffectedRows)] // это чтобы метод возвращал количество вставленных строк (совсем забыл про этот атрибут)
[SqlQuery( @"insert into entity( title ) values ( @Title ) returning id, revision")] // revision это для оптимистической блокировкиpublic abstractbool Insert( [Direction.Output("Id", "Revision")] Entity entity );
Если нам не помогут, то мы тоже никого не пощадим.