Russian Qt Forum
Июнь 16, 2024, 09:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Сохранить файл в блоб-поле БД MSSQL  (Прочитано 15665 раз)
Danila_Bagrofff
Гость
« : Январь 02, 2011, 22:30 »

Знаю, что записывать файлы в БД - не есть хорошо, но есть в этом необходимость.
Есть блоб-поле в БД MSSQL и путь до файла.
Как организовать запись данного файла в данное блоб-поле?...

Подскажите?.. не очень получается что-то...
Записан
merke
Гость
« Ответ #1 : Январь 03, 2011, 12:28 »

Делал такое как то на VB 6. Не знаю как это сделать на Qt, не сталкивался ещё с этим. Могу подсказать алгоритм.
Если файл очень большой, то нужно считывать его в память кусками и писать в блоб-поле. Записывать нужно в бинарном виде. Если файл не очень большой, то можно сразу считать его всего в память и записать в блоб-поле.
Записан
Danila_Bagrofff
Гость
« Ответ #2 : Январь 03, 2011, 12:44 »

да, файлы достаточно большие....

как это делать с одним insert'ом...?
Записан
merke
Гость
« Ответ #3 : Январь 03, 2011, 12:49 »

Считать в QByteArray и загнять всё это в базу
Записан
Danila_Bagrofff
Гость
« Ответ #4 : Январь 03, 2011, 17:29 »

Нет, именно интересно, как не читая весь файл, записать в бд... ведь инсерт один раз делается...

Или я что-то не понимаю?...
Записан
shirushizo
Гость
« Ответ #5 : Январь 03, 2011, 17:58 »

Функцию пользуй и делай инсерт
Код:
QByteArray QIODevice::readAll ()

Нет, именно интересно, как не читая весь файл, записать в бд... ведь инсерт один раз делается...
Или я что-то не понимаю?...
Не читая весь файл?  Шокированный Это как? Прочитал начало и конец, а середину пусть SQL сам выдумает?
Записан
alexman
Гость
« Ответ #6 : Январь 03, 2011, 18:31 »

Код:
QByteArray QIODevice::readAll ()
А что будете делать, если содержимое файла в оперативку не влезает?
Записан
Danila_Bagrofff
Гость
« Ответ #7 : Январь 04, 2011, 07:52 »

Вот именно интересует способ, как это сделать частями - в потоке, чтоб не забивать сильно оперативку - пусть чуть подольше, но менее грузно для оперативки...

Дайте совет, а народ?
Записан
Zmeishe
Гость
« Ответ #8 : Январь 04, 2011, 09:49 »

Задача решается средствами SQL сервера, т.е. API функциями SQL сервера.

Для Interbase/Firebird я сам BLOB частями записывал.
Вот пример
Код:
// Старт транзакции
...
// Присвоение значений параметрам sql инструкции
...
// Если параметр имеет тип BLOB
ISC_LONG total_size; // Размер файла
ISC_LONG blob_segment_size = 1024 * 32;

// Создание BLOB
isc_create_blob2(status_vector, &db_handle, &tr_handle, &blob_handle, &blob_id, 0, NULL) );

while( total_size )
{
 if (total_size < blob_segment_size) blob_segment_size = total_size;

 // Чтение сегментов из файла и запись в BLOB
 ...
 isc_put_segment(status_vector, &blob_handle, blob_segment_size, blob_segment);
 
 total_size -= blob_segment_size;
}
// Закрытие BLOB
isc_close_blob(status_vector, &blob_handle);

// Выполнение SQL инструкции (insert/update)
...
// Подтверждение транзакции
...
Записан
ufna
Гость
« Ответ #9 : Январь 04, 2011, 19:03 »

Считать частями - через QByteArray и QDataStream к примеру. В чемпроблема? В разделении на части?
Записан
Zmeishe
Гость
« Ответ #10 : Январь 04, 2011, 20:00 »

Считать частями - через QByteArray и QDataStream к примеру. В чемпроблема? В разделении на части?

Проблема в sql драйверах. Все драйверы принимают значения параметров sql запроса "за раз".
А с точки зрения Qt драйвер принимает значения от модели.
Ты можешь считывать частями, но модель будет это накапливать. И только потом передаст драйверу. Драйвер серверу.

Если у тебя в BLOB`ах хранятся файлы документов или картинок, т.е. размером до 30Мб, то на общей производительности это мало отразится.
А если в BLOB запихивать видео файлы от 100Мб до Гигабайтов, то "за раз" не только кеша sql сервера не хватит, но и операционки может не хватить - свопить начнёт.  С производительностью можешь проститься.
Выход один - читать частями и в BLOB писать тоже частями, т.е. в обход Qt модели и SQL драйвера, что я, собственно, и показал на выжимке из своего кода.
Записан
Danila_Bagrofff
Гость
« Ответ #11 : Январь 05, 2011, 15:07 »

А программно видимо никак?... у меня пока файлы до 100 метров...
Записан
twp
Гость
« Ответ #12 : Январь 05, 2011, 17:15 »

RTMF http://www.databasejournal.com/features/mssql/article.php/3724556/Storing-Images-and-BLOB-files-in-SQL-Server-Part-2.htm
Записан
Zmeishe
Гость
« Ответ #13 : Январь 05, 2011, 17:27 »

Цитата: Danila_Bagrofff
А программно видимо никак?... у меня пока файлы до 100 метров...

Тогда непонятно зачем этот вопрос был?
Нет, именно интересно, как не читая весь файл, записать в бд... ведь инсерт один раз делается...
Если не читая весь файл, значит частями. Теперь и частями тебе не подходит.

Ты думаешь мы тут стелепатять должны, что именно тебе нужно? Или у тебя пока мнения нет?
Записан
Danila_Bagrofff
Гость
« Ответ #14 : Январь 09, 2011, 19:53 »

Все подходит, только это хотелось бы реализовать программными методами только c помощью qt.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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