Форум: "Базы";
Текущий архив: 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