Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Вниз

обработка BLOB-поля при сохранении изменений в ClientDataSet   Найти похожие ветки 

 
Desdechado ©   (2004-02-29 19:05) [0]

Есть странная ситуация. В обработчике 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;
но эффект тот же :(


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

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


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

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


 
Asdor ©   (2004-03-04 15:08) [3]

Какая СУБД?


 
Asdor ©   (2004-03-04 15:10) [4]

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


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

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


 
Семен Сорокин ©   (2004-03-05 11:03) [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 );
              oBlobStream.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;


 
Desdechado ©   (2004-03-05 15:24) [7]

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


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

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

CommandText := CommandText + "UPDATE ...


 
Desdechado ©   (2004-03-05 17:12) [9]

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


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

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


 
Desdechado ©   (2004-03-09 18:52) [11]

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



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.031 c
14-1078512239
Undert
2004-03-05 21:43
2004.04.04
Windows 2003 Server and NS


3-1078210812
aga123
2004-03-02 10:00
2004.04.04
GUID в поле таблицы DBF


4-1075031625
Kryptonix
2004-01-25 14:53
2004.04.04
Неработает хук моуза и клабиатуры вместе :(((


1-1079197102
Kuzmich
2004-03-13 19:58
2004.04.04
Обработка нажатия левой и правой кнопки одновременно


9-1063462188
Orc
2003-09-13 18:09
2004.04.04
Фоновая анимация





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский