Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Проблема с копированием BLOB поля в MS SQL


Автор: Pakshin A. S. 28.7.2011, 12:10
Доброго времени суток! Пишу функцию по копированию BLOB поля из одной базы одной таблицы в другую базу другой таблицы.

Код

procedure CopyBLOB(DataSet: TDataSet);
var
  vADOTable: TADOTable;
  vFileName: string;
begin
  vFileName := ExtractFilePath(ParamStr(0)) + 'TempFile.tmp';

  vADOTable := TADOTable.Create(nil);

  with vADOTable do
    try
      ConnectionString := FDBConnectionString;
      EnableBCD := True;
      TableName := DataSet.Name; // здесь имя таблицы как раз
      ReadOnly := False;
      Open;
      Edit;
      DataSet.First;
      while not Eof do
        begin
          if DataSet.Eof then
            begin
              Close;
              exit;
            end;

          try
            TBlobField(DataSet.FieldByName('BLOBField')).SaveToFile(vFileName);
            TBlobField(FieldByName('BLOBField')).LoadFromFile(vFileName);
          except
            on e: exception do
              ShowMessage(e.message);
          end;

          DeleteFile(PChar(vFileName));

          Next;
          DataSet.Next;
        end;
      Post;
      Close;
    finally
      Free;
    end;
end;


Первая итерация... Из эталонного DataSet забирается поле и сохраняется в файл. У меня в тесте этот файл пустой. Пустой файл в таблицу загружается. Переходим на вторую итерацию. Создается новый заполненный данными файл. Но при вызове LoadFromFile функция без всяких ошибок просто "сворачивается". Try...Except также ничего не ловит. Визуальных сообщений нет.

Подумалось, что система не хочет писать заполненный файл. Подсунул всегда заполненный файл. Первая итерация прошла нормально, а вторая также вылетела.

Вставил Post после каждой записи в таблицу. Не помогло: вторая итерация вылетела.

Через Inspect поле в таблице просматривается, Eof нету, AV нету...

Подскажите в какую сторону копать дальше... 

Дополнение:
Вставил перед 
   while not Eof do
установку на первую запись:
   First;

Падает с теми же симптомами но уже прямо на первой записи...

Автор: Pakshin A. S. 28.7.2011, 14:19
Нашел где сваливается...

Не может создать TADOBlobStream. Валится в конструкторе:

Код

    if not (FDataSet.State in [dsEdit, dsInsert]) then
      DatabaseError(SNotEditing, FDataSet);


FDataSet.State получается равным dsBrowse => DatabaseError, которая по всей видимости где-то перехватилась...

Что не так с кодом?

Автор: Pakshin A. S. 28.7.2011, 14:36
Тьфу... Вот я ступил... Edit же вызывается для каждой строки...  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)