Балачки молоді
Меню сайту
Міні-чат
Наше опитування
Оцените мой сайт
Всього відповідей: 44
Головна » 2009 » Квітень » 22 » Delphi. Работа с Blob полями в MSSQL
Delphi. Работа с Blob полями в MSSQL
18:20

Выгрузка и загрузка файлов

Описание метода работы с Blob полями в СУБД MSSQL.

БАЗА ДАННЫХ

Поле сделано типом varbinary (max) – позволяет хранить в MSSQL Express до 1,5гб.

Поле должно быть nullable – то есть может быть после вставки строки данных быть NULL 



ЗАПИСЬ ФАЙЛА В БД

Алгоритм:
Вставили строку с данными в таблицу, но пока без загрузки файла (поле остается NULL);
Фильтруем таблицу на предмет только что вставленной записи;
Включаем редактирование вставленной строки;
Записываем с помощью TBlobField файл в БЛОБ поле;
Обязательно применяем изменение – Post.

Пример:

procedure AddWellTrajectory(wellID:Integer; trajectory: TWellTrajectory);

var

  blobF: TBlobField;

  curDir : string;

  trjID : Integer;

begin

  ConnectToDB;

  curDir := GetCurrentDir; 

  with DBModule.DM do

  begin

  // ВСТАВИЛИ ДАННЫЕ

  QueryInsertTrajectory.Parameters.ParamByName('Param1').Value := wellId;

  QueryInsertTrajectory.Parameters.ParamByName('Param2').Value := trajectory.Origin.X;

  QueryInsertTrajectory.Parameters.ParamByName('Param3').Value := trajectory.Origin.Y;

  QueryInsertTrajectory.Parameters.ParamByName('Param4').Value := trajectory.Origin.Z;

  QueryInsertTrajectory.ExecSQL; 

  // ПОЛУЧИЛИ ID ДЛЯ ФИЛЬТРАЦИИ

  trjID := LastIdentity('Траектория'); 

  // ФИЛЬТР И РЕЖИМ РЕДАКТИРОВАНИЯ

  QueryTrajectoryFull.Close;

  QueryTrajectoryFull.Open;

  QueryTrajectoryFull.Filtered := False;

  QueryTrajectoryFull.Filter := 'ID_Траектории = ' + IntToStr(trjID);

  QueryTrajectoryFull.Filtered := True;

  QueryTrajectoryFull.Edit;


  // БЕРЕМ БЛОБ ОБЪЕКТ

  blobF := QueryTrajectoryFull.FieldByName('ФайлТраектории') as TBlobField;


  // ПОЛУЧЕНИЕ ФАЙЛА ДЛЯ ПОСЛЕДУЮЩЕЙ ЗАГРУЗКИ

  trajectory.SaveToFile(curDir + '\\trj1.txt');

  // ЧИТАЕМ СПЕЦИАЛЬНЫМ МЕТОДОМ ОБЪЕКТА ТИПА TBlobField ИЗ ФАЙЛА

  blobF.LoadFromFile(curDir + '\\trj1.txt');

  // ПРИМЕНЯЕМ В БД

  QueryTrajectoryFull.Post; 

  // СЧИТАННЫЙ ФАЙЛ – ВРЕМЕННЫЙ – УДАЛЯЕМ ЕГО

  DeleteFile(curDir + '\\trj1.txt'); 

  end;

end; 



ЧТЕНИЕ ФАЙЛА ИЗ БД

Алгоритм:
Отфильтровали таблицу;
Взяли объект ТБЛОБ;
Выгрузили файл.


Пример:

function GetWellTrajectoy(wellID: Integer): TWellTrajectory;

var

  trajectory: TWellTrajectory;

  blobF: TBlobField;

begin

  trajectory := TWellTrajectory.Create; 

  // ФИЛЬТРУЕМ

  DM.QueryTrajectoryFull.Close;

  DM.QueryTrajectoryFull.Open;

  DM.QueryTrajectoryFull.Filtered := False;

  DM.QueryTrajectoryFull.Filter := 'ID_Скважины = ' + IntToStr(wellID);

  DM.QueryTrajectoryFull.Filtered := True;

  DM.QueryTrajectoryFull.Active := true; 

  // БЕРЕМ ОБЪЕКТ

  blobF := DM.QueryTrajectoryFull.FieldByName('ФайлТраектории') as TBlobField;

  // ЕСЛИ ВДРУГ ОКАЗАЛСЯ NULL – ВЫХОДИМ

  if blobF.Value = '' then

  begin

  Result := nil;

  FreeAndNil(trajectory);

  Exit;

  end; 

  // ВЫГРУЖАЕМ В НУЖНЫЙ ФАЙЛ

  blobF.SaveToFile('trj3.txt'); 

  // ДЕЛАЕМ С ПОЛУЧЕННЫМ ФАЙЛОМ ТО, ЧТО НАМ НУЖНО 

  trajectory.LoadFromFile('trj3.txt');

  DeleteFile('trj3.txt'); 

  Result := trajectory;

end; 
 
 

ПОЛУЧЕНИЕ ID ПОСЛЕДНЕЙ ВСТАВЛЕННОЙ ЗАПИСИ В ТАБЛИЦЕ 
Для этого нужно добавить ADOQuery с таким запросом:

SELECT IDENT_CURRENT(:Param1) AS LastID 

Если у информационной системы будет много пользователей – то способ не очень надежный, т.к. можно получить ID соседнего пользователя – другие варианты через транзакции надо смотреть в интернете. 
Для получения ID используется такой код:
 

function LastIdentity(tableName: string): Integer;

begin

  DM.QueryLastID.Parameters.ParamByName('Param1').Value := tableName;

  DM.QueryLastID.Close;

  DM.QueryLastID.Open;

  Result := DM.QueryLastID.Fields[0].Value;

end;

Переглядів: 1910 | Додав: admin
Всього коментарів: 0
Додавати коментарі можуть лише зареєстровані користувачі.
[ Реєстрація | Вхід ]
Форма входу
Календар новин
«  Квітень 2009  »
ПнВтСрЧтПтСбНд
  12345
6789101112
13141516171819
20212223242526
27282930
Пошук
Друзі сайту
    Статистика

    Онлайн всього: 1
    Гостей: 1
    Користувачів: 0
    Copyright MyCorp © 2017