Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ХП и FbDataAdapter.Update() / 8 сообщений из 8, страница 1 из 1
13.06.2006, 11:47
    #33787034
RomCom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ХП и FbDataAdapter.Update()
Всем добрый день!
Есть ХП для обнавления данных:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
CREATE PROCEDURE EDIT_GOODS(
    EDITTYPE SMALLINT,
    GOODS_HIST_ID INTEGER,
    CATERER_NAME VARCHAR( 50 ),
    NAME VARCHAR( 40 ),
    COST DOUBLE PRECISION)
RETURNS (
    GOODS_HIST_PK INTEGER)
AS   
DECLARE VARIABLE GOODS_PK INTEGER;
begin
  if(EDITTYPE= 0 ) then /* 0-insert */
  begin
   GOODS_PK=GEN_ID(GEN_GOODS_ID, 1 );
   GOODS_HIST_PK=GEN_ID(GEN_GOODS_HIST_ID, 1 );
   insert into GOODS (GOODS_PK,GOODS_HIST_ID) values(:GOODS_PK,:GOODS_HIST_PK);
   insert into GOODS_HIST (GOODS_HIST_PK,GOODS_ID,CATERER_NAME,NAME,COST)
      values(:GOODS_HIST_PK,:GOODS_PK,:CATERER_NAME,:NAME,:COST);
  end
  else if(EDITTYPE= 1 ) then /* 1-edit */
  begin
    update GOODS_HIST set CATERER_NAME=:caterer_name,NAME=:name,COST=:cost
            where(GOODS_HIST_PK=:goods_hist_id);
    GOODS_HIST_PK=goods_hist_id;
  end  
  else if(EDITTYPE= 2 ) then /* 2-delet */
  begin                          
   select GOODS_ID from GOODS_HIST where(GOODS_HIST_PK=:goods_hist_id) into :goods_pk;
   delete from GOODS where(GOODS_PK=:goods_pk);
   goods_pk= 0 ;
   for select GOODS_ID from TRAFFIC where(GOODS_ID=:goods_hist_id) into :goods_pk do
   begin goods_pk= 1 ; break; end
   if (goods_pk= 0 ) then
    delete from GOODS_HIST where(GOODS_HIST_PK=:goods_hist_id);
  end
  suspend;
end
И код insert-a на C#:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SprDA = new FirebirdSql.Data.FirebirdClient.FbDataAdapter();
...
SprDA.InsertCommand.CommandType = CommandType.Text;
SprDA.InsertCommand.CommandText = "EXECUTE PROCEDURE EDIT_GOODS(0,0,@CATERER_NAME,@NAME,@COST)";
SprDA.InsertCommand.Parameters.Clear();
FbParameter p = SprDA.UpdateCommand.Parameters.Add(new FbParameter("@GOODS_HIST_PK", FbDbType.Integer,  0 , "GOODS_HIST_PK"));
p.Direction = ParameterDirection.Output;
SprDA.InsertCommand.Parameters.Add(new FbParameter("@CATERER_NAME", FbDbType.VarChar,  50 , "CATERER_NAME"));
SprDA.InsertCommand.Parameters.Add(new FbParameter("@NAME", FbDbType.VarChar,  40 , "NAME"));
SprDA.InsertCommand.Parameters.Add(new FbParameter("@COST", FbDbType.Double,  0 , "COST"));
При добавлении записи и вызове SprDA.Update(dataSet1, "Table1"); данные добавляются,
но в Table1 не изменяется значение поля GOODS_HIST_PK на возрощаемое из ХП.
плюс выдается ошибка:
Код: plaintext
An attempt to execute an INSERT, UPDATE, or DELETE statement resulted in zero records affected.
Подскажите в чем моя ошибка??
...
Рейтинг: 0 / 0
13.06.2006, 12:11
    #33787134
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ХП и FbDataAdapter.Update()
Код: plaintext
1.
SprDA.InsertCommand.UpdatedRowSource = UpdateRowSource.OutputParameters;
Ну а с птичьим кодом сами разбирайтесь...
...
Рейтинг: 0 / 0
13.06.2006, 12:37
    #33787236
RomCom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ХП и FbDataAdapter.Update()
Не прошло :(
Результат тот же.
Может я чего еще упустил?

P.S. Птичий код рабочий. Проверено, на Delphi+FibPlus.
...
Рейтинг: 0 / 0
13.06.2006, 14:17
    #33787629
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ХП и FbDataAdapter.Update()
Возможно, FirebirdSql.Data.FirebirdClient кривит... пошукайте обновлений...
...
Рейтинг: 0 / 0
13.06.2006, 18:02
    #33788521
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ХП и FbDataAdapter.Update()
Вы отсель брали? Попробуйте подцепить сорцы и там в дебаге пройтись... Либо в конце пр-ры делайте select из вставленной строки и SprDA.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord;
...
Рейтинг: 0 / 0
14.06.2006, 05:25
    #33789035
RomCom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ХП и FbDataAdapter.Update()
Покопался я в сырцах :)
Есть там файл FbDataAdapter.cs, но в нём переопределен только метод:
Код: plaintext
protected override int Update(DataRow[] dataRows, DataTableMapping tableMapping)
Причем protected . Честно говоря для меня не понятно используется ли он если вызывать SprDA.Update(dataSet1, "Table1");
В любом случае меня насторожил вот этот участок кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int rowsAffected = command.ExecuteNonQuery();
if (rowsAffected ==  0 )
{
  throw new DBConcurrencyException("An attempt to execute an INSERT, UPDATE, or DELETE statement resulted in zero records affected.");
}
updated++;
// и далее присвоение значений выходных параметров столбцам
т.е. получается если rowsAffected == 0 срабатывает исключение DBConcurrencyException и последующий код невыполняется?
А как добится чтоб ExecuteNonQuery возращала 1 при выполнении ХП?
...
Рейтинг: 0 / 0
14.06.2006, 07:01
    #33789061
RomCom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ХП и FbDataAdapter.Update()
Всем спасибо! Ситуацию разрулил.
Просто надо было использовать CommandType.StoredProcedure :-)
Тогда исключение DBConcurrencyException невозникает.
...
Рейтинг: 0 / 0
14.06.2006, 10:28
    #33789366
RomCom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ХП и FbDataAdapter.Update()
Решив одно, натолкнулся на другое. Ошибка выскакивает странная!
Подцепляю события RowDeleted, RowChanged и вызываю FbDataAdapter.Update() в них:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
dataSet1.Tables[ 0 ].RowDeleted += new DataRowChangeEventHandler(Row_Changed);
dataSet1.Tables[ 0 ].RowChanged += new DataRowChangeEventHandler(Row_Changed);
...........
        public void Row_Changed(Object sender, DataRowChangeEventArgs e)
        { 
            if(e.Action == DataRowAction.Add || e.Action == DataRowAction.Change ||
               e.Action == DataRowAction.Delete)
            try
            {
                if (!(e.Action == DataRowAction.Change && e.Row.RowState == DataRowState.Added))
                {
                    SprDA.Update(e.Row.Table);
                    e.Row.Table.AcceptChanges();
                }
            }
            catch (System.Data.DBConcurrencyException)
            {
            }
        }
Все прекрасно, еслиб не одно НО. Change и Delete отрабатывают нормально.
А вот Add почему то работает нормально если только перед этим не было вызовов с Change или Delete.
В этом случае в событии Row_Changed
e.Row.RowState == DataRowState.Added
а уже в RowUpdating FbDataAdapter-а
e.Row.RowState == DataRowState.Modified (или Deleted) т.е. значение предыдущей операции.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ХП и FbDataAdapter.Update() / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]