Главная страница
    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.49 MB
Время: 0.076 c
14-1078952159
ST
2004-03-10 23:55
2004.04.04
Delphi 8.0


1-1078937919
Nekto
2004-03-10 19:58
2004.04.04
вывод на принтер


7-1073914819
Sergant
2004-01-12 16:40
2004.04.04
Прямая работа с портами


3-1078214709
Laymer
2004-03-02 11:05
2004.04.04
Memo - поле


1-1079554043
Ravilr
2004-03-17 23:07
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский