@Dellomorter

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

Пишу сейчас функциональную прогу на фреймворке qt. Так вот. Суть вопроса в том, что надо каким-то образом сохранять файлы в бд ms sql server и потом их доставать оттуда. Почему именно складирование в бд. В ms sql есть такая штука как filestream. Насколько я понял она заменяет вайлы VARBINARY и BLOB на ссылки, а сами вайлы складывает на сервере. Вариант со складированием сразу где-то на компе не катит, т.к. файлы надо хранить именно на сервере и любой пользователь мог достать через программу этот файл с сервера. Да, можно написать отдельную клиент-серверную часть, но это ещё 3-4 томика информации про HTTP и сокеты, а это уже перебор.
  • Вопрос задан
  • 81 просмотр
Решения вопроса 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. пожалуйста, не издевайтесь над сервером, пользователями, администраторами и здравым смыслом. Не храните файлы в базе данных! Только очень большая нужда может заставить так поступать, а уж если файлы имеют большой размер, то мало какое железо адекватно потянет такое 'решение'
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы