Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

обработка BLOB-поля при сохранении изменений в ClientDataSet [D7, Firebird 1.03]


Desdechado ©   (2004-02-29 19:05:00) 

Есть странная ситуация. В обработчике BeforeUpdateRecord (см. ниже) при добавлении новой записи блоб сохраняется, а при изменении - ругается, что No value for parameter P0
procedure TfrmAirWire.dspAirBeforeUpdateRecord( Sender: TObject; SourceDS: TDataSet;
         DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean );
var
 qrySpec: TSQLDataSet;
 oBlobStream: TStream;
begin
 qrySpec := TSQLDataSet.Create( Self );
 with( qrySpec ) do
   try
     SQLConnection := dbxLio;
     case( UpdateKind ) of
       ukInsert:          //--- для новой записи
         begin
           oBlobStream := DeltaDS.CreateBlobStream( DeltaDS.FieldByName( 'air_blob' ) as TBlobField, bmRead );
           CommandText := 'INSERT INTO AirLines( nagr_id, air_len, comment, air_blob, blob_ext )' +
                          '  VALUES( ' + DeltaDS.FieldByName( 'nagr_id' ).AsString + ', ' +
                                         DeltaDS.FieldByName( 'air_len' ).AsString + ', ' +
                                   '"' + DeltaDS.FieldByName( 'comment' ).AsString + '", ' +
                                   ' :P0, "' + DeltaDS.FieldByName( 'blob_ext' ).AsString + '" )';
           Params[ 0 ].DataType := ftBlob;
           Params[ 0 ].ParamType := ptInput;
           Params[ 0 ].LoadFromStream( oBlobStream, ftBlob );
           ExecSQL;
           Applied := True;
         end;
       ukModify:          //--- для измененной записи
         begin
           if( not VarIsClear( DeltaDS.FieldByName( 'blob_ext' ).NewValue ) ) then
             begin
               CommandText := CommandText + 'UPDATE AirLines SET blob_ext = "' + DeltaDS.FieldByName( 'blob_ext' ).AsString + '",' +
                              ' air_blob = :P0 WHERE air_id = ' + VarToStr( DeltaDS.FieldByName( 'air_id' ).OldValue );
               oBlobStream := DeltaDS.CreateBlobStream( DeltaDS.FieldByName( 'air_blob' ) as TBlobField, bmRead );
               Params[ 0 ].DataType := ftBlob;
               Params[ 0 ].ParamType := ptInput;
               Params[ 0 ].LoadFromStream( oBlobStream, ftBlob );
               ExecSQL;
             end;
           Applied := True;
         end;
     end; // case
   finally
     oBlobStream.Free;
     qrySpec.Free;
   end; // try & with
end;

При трассировке видно, что параметр заполняется, размер совпадает.
В чем может быть дело?
Пробовал еще и не через поток присваивать:
Params[ 0 ].Value := ( DeltaDS.FieldByName( 'air_blob' ) as TBlobField ).AsVariant;
но эффект тот же :(


Desdechado   (2004-03-09 18:52:00) [1]

если кому интересно, я нашел, в чем проблема
каждый раз при присваивании CommnadText компонент пересоздает список параметров
а у меня было последнее присваивание ПОСЛЕ заполнения параметра, и, естественно, AV


1   (2004-03-07 15:01:00) [2]

up
примечание: это не флуд, а попытка обратить внимание на пост


Desdechado   (2004-03-05 17:12:00) [3]

сорри, я просто этот SQL формирую динамически, а когда код сюда постил, забыл этот кусок выбросить.
но SQL формируется корректно, я под отладчиком проверял


Семен Сорокин   (2004-03-05 15:31:00) [4]

а зачем для изменеия вот это:

CommandText := CommandText +'UPDATE ...


Desdechado   (2004-03-05 15:24:00) [5]

спасибо за попытку, однако не помогает :(
Ведь я говорил, что для новой записи - пишет! А для измененной - аналогичный механизм, но не пишет. Да и метод LoadFromStream работает - параметр заполняется-таки (трассировал), но вот в БД не передается...


Семен Сорокин   (2004-03-05 11:03:00) [6]

procedure TfrmAirWire.dspAirBeforeUpdateRecord( Sender: TObject; SourceDS: TDataSet;
        DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean );
var
qrySpec: TSQLDataSet;
oBlobStream: TStream;
begin
qrySpec := TSQLDataSet.Create( Self );
with( qrySpec ) do
  try
    SQLConnection := dbxLio;
    case( UpdateKind ) of
      ukInsert:          //--- для новой записи
        begin
          oBlobStream := DeltaDS.CreateBlobStream( DeltaDS.FieldByName( 'air_blob' ) as TBlobField, bmRead );
          oBlobStream.Position := 0; 
          CommandText := 'INSERT INTO AirLines( nagr_id, air_len, comment, air_blob, blob_ext )' +
                         '  VALUES( ' + DeltaDS.FieldByName( 'nagr_id' ).AsString + ', ' +
                                        DeltaDS.FieldByName( 'air_len' ).AsString + ', ' +
                                  '"' + DeltaDS.FieldByName( 'comment' ).AsString + '", ' +
                                  ' :P0, "' + DeltaDS.FieldByName( 'blob_ext' ).AsString + '" )';
          Params[ 0 ].DataType := ftBlob;
          Params[ 0 ].ParamType := ptInput;
          Params[ 0 ].LoadFromStream( oBlobStream, ftBlob );
          ExecSQL;
          Applied := True;
        end;
      ukModify:          //--- для измененной записи
        begin
          if( not VarIsClear( DeltaDS.FieldByName( 'blob_ext' ).NewValue ) ) then
            begin
              CommandText := CommandText + 'UPDATE AirLines SET blob_ext = "' + DeltaDS.FieldByName( 'blob_ext' ).AsString + '",' +
                             ' air_blob = :P0 WHERE air_id = ' + VarToStr( DeltaDS.FieldByName( 'air_id' ).OldValue );
              oBlobStream := DeltaDS.CreateBlobStream( DeltaDS.FieldByName( 'air_blob' ) as TBlobField, bmRead );
              oB lobStream.Position := 0;
              Params[ 0 ].DataType := ftBlob;
              Params[ 0 ].ParamType := ptInput;
              Params[ 0 ].LoadFromStream( oBlobStream, ftBlob );
              ExecSQL;
            end;
          Applied := True;
        end;
    end; // case
  finally
    oBlobStream.Free;
    qrySpec.Free;
  end; // try & with
end;


3   (2004-03-05 10:46:00) [7]

Удалено модератором


Asdor   (2004-03-04 15:10:00) [8]

Стормозил... :(
Про Firebird не скажу ничего...


Asdor   (2004-03-04 15:08:00) [9]

Какая СУБД?


2   (2004-03-04 12:08:00) [10]

Удалено модератором


1   (2004-03-01 18:18:00) [11]

Удалено модератором
Примечание: Флада нам не надо


Наверх

Титульная страница Поиск, карта сайта Написать письмо