Russian Qt Forum
Ноябрь 28, 2024, 05:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Сохранить файл в блоб-поле БД MSSQL  (Прочитано 15829 раз)
twp
Гость
« Ответ #15 : Январь 11, 2011, 11:56 »

А чем собственно не устроило то решение, что я кинул по ссылке? По ходу это то что нужно - нет прямой работы с файлами, а тем более разбитие их на части, все делается средствами СУБД + Qt как интерфейс. Чего не хватает?
Записан
Prm
Гость
« Ответ #16 : Январь 11, 2011, 16:06 »

Опишу свою методику, она на 100% применима для данного случая. Единственное исключение - файл хранится в текстовом поле. Использую MySQL. В базе данных сохраняются *.pdf файлы некоторых отчетов. Данные храню в двух таблицах. Первая - описание параметров отчета, вторая - данные отчета (несколько записей на один файл, количество записей зависит от размера файла и размера поля). Содержимое файла хранится в текстовом  (шестнадцатеричном) виде. Структура таблиц следующая:
Код:
/*=============================================================================
                   Таблица имеющихся файлов
 =============================================================================*/
CREATE TABLE IF NOT EXISTS `files_info`
(
    `ID`                int(10) unsigned    NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор записи',
    `CREATED`             datetime            DEFAULT NULL                COMMENT 'Время создания записи', 
    `USER_NAME`         TEXT                                                    COMMENT 'Оператор',
    `PROC_DATE`         datetime            DEFAULT NULL                COMMENT 'Дата поверки',
    `REP_NUMBER`        int(10) unsigned    NULL                          COMMENT 'Номер отчета', 
    PRIMARY KEY  (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET='UTF8' COMMENT='Таблица имеющихся файлов';

/*=============================================================================
                   Таблица данных(содержимого) файлов
 =============================================================================*/
CREATE TABLE IF NOT EXISTS `files_data`
(
    `ID`                  int(10) unsigned    NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор записи',
    `FILE_ID`           int(10) unsigned    DEFAULT NULL                    COMMENT 'Идентификатор файла',   
    `DATA`              TEXT                                                         COMMENT 'Данные файла',
    PRIMARY KEY  (`ID`),
    CONSTRAINT `FK_4` FOREIGN KEY (`FILE_ID`) REFERENCES `files_info` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET='UTF8' COMMENT='Таблица данных файлов';

Алгоритм сохранения файла следующий:
1. Создаю запись о файле в таблице files_info, получаю ID записи
2. Частями считываю файл в бинарном виде, конвертирую в строку в шестнадцатеричном виде
3. Создаю запись с данными файла в таблице files_data, FILE_ID = идентификатор записи о файле
4. Повторить пп 2-3 пока файл не будет считан и сохранен в БД полностью

Почему использовано данное решение:
1. Работа с базой данных через хранимые процедуры
2. Использование функции MySQL LOAD_FILE(...) невозможно, т.к. клиент и сервер разные машины и нет возможности скопировать файл на сервер. Фунция LOAD_FILE(...) помещает в базу только файлы, расположенные на той же машине, на которой запущен сервер MySQL

Плюсы:
-малое расходование ресурсова

Минусы:
-требуется время на конвертирование данных файла
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.058 секунд. Запросов: 21.