Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: CL | DM;

Вниз

обработка 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.042 c
3-1078924228
Anarki
2004-03-10 16:10
2004.04.04
Проблема с запросом в ADOQuery


7-1074615667
DCoder
2004-01-20 19:21
2004.04.04
регистрация расширения *.DB в системе


6-1075135863
kor@l
2004-01-26 19:51
2004.04.04
HTTP


11-1058571270
LambdA
2003-07-19 03:34
2004.04.04
Где аналог StrToFloat и FloatToStr?


4-1070012026
FireMan_Alexey
2003-11-28 12:33
2004.04.04
Блокировка клавиатуры