Задать вопрос
@Dellomorter

Файлообменник на qt5 c++ с ms sql?

Пишу сейчас функциональную прогу на фреймворке qt. Так вот. Суть вопроса в том, что надо каким-то образом сохранять файлы в бд ms sql server и потом их доставать оттуда. Почему именно складирование в бд. В ms sql есть такая штука как filestream. Насколько я понял она заменяет вайлы VARBINARY и BLOB на ссылки, а сами вайлы складывает на сервере. Вариант со складированием сразу где-то на компе не катит, т.к. файлы надо хранить именно на сервере и любой пользователь мог достать через программу этот файл с сервера. Да, можно написать отдельную клиент-серверную часть, но это ещё 3-4 томика информации про HTTP и сокеты, а это уже перебор.
  • Вопрос задан
  • 101 просмотр
Подписаться 1 Простой 5 комментариев
Решения вопроса 1
@rPman
сохранить в бд через QSqlDatabase надо использовать QSqlQuery запрос
открываем документацию и видим bindValue, позволяет добавлять параметры указанного типа ParamType - QSql::Binary

Мне очень лень было искать или писать код поэтому попросил chatgpt, по сути он верный, может есть какие то нюансы или неточности, исправляются документацией
spoiler
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QVariant>
#include <QFile>
#include <QByteArray>

void writeBinaryData(const QString &filePath) {
    // Создаем объект базы данных
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("my_database.db");

    // Открываем базу данных
    if (!db.open()) {
        qDebug() << "Не удалось открыть базу данных";
        return;
    }

    // Создаем объект QSqlQuery для выполнения запросов к базе данных
    QSqlQuery query;

    // Создаем таблицу, если она еще не существует
    query.exec("CREATE TABLE IF NOT EXISTS my_table (id INTEGER PRIMARY KEY, data BLOB)");

    // Открываем файл
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly)) {
        qDebug() << "Не удалось открыть файл";
        return;
    }

    // Читаем все данные из файла
    QByteArray fileData = file.readAll();

    // Закрываем файл
    file.close();

    // Готовим запрос на вставку данных в таблицу
    query.prepare("INSERT INTO my_table (data) VALUES (:data)");

    // Привязываем двоичные данные к запросу
    query.bindValue(":data", fileData);

    // Выполняем запрос
    if (!query.exec()) {
        qDebug() << "Не удалось выполнить запрос";
        return;
    }

    qDebug() << "Данные успешно записаны в базу данных";
}


p.s. пожалуйста, не издевайтесь над сервером, пользователями, администраторами и здравым смыслом. Не храните файлы в базе данных! Только очень большая нужда может заставить так поступать, а уж если файлы имеют большой размер, то мало какое железо адекватно потянет такое 'решение'
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы