![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
обработка 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]Удалено модератором
Примечание: Флада нам не надо