数据库建立库-Qt

数据库的连接_qt-CSDN博客

数据库连接后进行建立库的操作

库的建立需要预先声明库的库名和选择字符集以及库内的排序顺序

代码部分逻辑

一、void skySQL::onConnectClicked():数据库连接核心处理

cpp 复制代码
void skySQL::onConnectClicked() {
    if (m_conn) {
        mysql_close(m_conn);
        m_conn = nullptr;
        addLog("已关闭旧连接", LogLevel::Info);
    }

    m_conn = connectToDatabase();
    if (m_conn) {
        // 移除 displayDatabaseInfo();  // 不再显示表信息
        QLabel* label = new QLabel("<h2>数据库连接成功</h2><p>您现在可以选择其他功能,如新建库或表管理。</p>");
        label->setWordWrap(true);
        label->setStyleSheet("padding: 10px;");
        resultDisplay->setWidget(label);  // 只显示连接成功消息
        addLog("数据库连接成功", LogLevel::Info);  // 移除"已加载表结构"
    }
    else {
        addLog("数据库连接失败,请检查配置", LogLevel::Error);
    }
}
cpp 复制代码
MYSQL* skySQL::connectToDatabase() {
    QString hostStr = hostEdit->text();
    QByteArray hostBa = hostStr.toUtf8();
    const char* host = hostBa.constData();

    QString userStr = userEdit->text();
    QByteArray userBa = userStr.toUtf8();
    const char* user = userBa.constData();

    QString databaseStr = databaseEdit->text();
    QByteArray databaseBa = databaseStr.toUtf8();
    const char* database = databaseBa.constData();

    QString passwordStr = passwordEdit->text();
    QByteArray passwordBa = passwordStr.toUtf8();
    const char* password = passwordBa.constData();

    int port = portEdit->text().toInt();

    MYSQL* conn = mysql_init(NULL);
    if (!conn) {
        addLog("MySQL初始化失败", LogLevel::Error);
        return nullptr;
    }
    addLog("MySQL初始化成功", LogLevel::Info);

    if (!mysql_real_connect(conn, host, user, password, database, port, NULL, 0)) {
        addLog(QString("连接数据库失败: %1").arg(mysql_error(conn)), LogLevel::Error);
        mysql_close(conn);
        return nullptr;
    }
    addLog("成功连接到MySQL数据库", LogLevel::Info);
    return conn;
}
步骤 代码逻辑 作用与细节
1 检查m_conn是否非空,若有则关闭 避免 "旧连接未释放" 导致的资源泄漏: - 用mysql_close(m_conn)关闭 MySQL 连接 - 将m_conn置为nullptr,标记 "无活跃连接" - 记录 "已关闭旧连接" 的 Info 日志
2 调用connectToDatabase()获取新连接,赋值给m_conn 复用之前的连接创建函数(connectToDatabase()返回MYSQL*句柄): - m_connskySQL类的成员变量 ,用于在整个类中共享 "当前活跃连接" - 这一步是 "连接成功的关键"------ 后续新建数据库必须依赖m_conn
3 连接成功(m_conn非空) 反馈结果给用户: - 生成 HTML 格式的提示("连接成功,可新建库 / 管理表") - 用resultDisplay->setWidget(label)将提示显示到界面(resultDisplay应该是个容器,比如QScrollArea) - 记录 "连接成功" 的 Info 日志
4 连接失败(m_conn为空) 记录 "连接失败,请检查配置" 的 Error 日志,无界面提示(仅日志)
模块 2:点击 "创建数据库" 按钮的业务逻辑(信号槽)

这是新建库的核心,逻辑分为 "前置校验""SQL 执行""成功 / 失败处理" 三部分,步骤严谨

步骤 1:前置校验(拦截非法操作)
步骤 2:构造并执行 "新建数据库" SQL
步骤 3:执行成功后的处理(反馈详细信息)
cpp 复制代码
  // 信号槽
  connect(createDbButton, &QPushButton::clicked, this, [this]() {
      if (!m_conn) {
          QLabel* label = new QLabel("<h3>请先连接数据库,再新建库。</h3>");
          label->setWordWrap(true);
          resultDisplay->setWidget(label);
          addLog("未连接数据库,无法创建新库", LogLevel::Warning);
          return;
      }

      QString dbName = newDbNameEdit->text().trimmed();
      QString charset = charsetCombo->currentText();
      QString collation = collationCombo->currentText();

      if (dbName.isEmpty()) {
          QLabel* label = new QLabel("<h3>数据库名称不能为空</h3>");
          label->setWordWrap(true);
          resultDisplay->setWidget(label);
          addLog("数据库名称为空,无法创建", LogLevel::Error);
          return;
      }

      QString createQuery = QString("CREATE DATABASE `%1` CHARACTER SET %2 COLLATE %3;")
          .arg(dbName, charset, collation);

      if (mysql_query(m_conn, createQuery.toUtf8().constData()) == 0) {
          addLog(QString("成功创建数据库: %1 (字符集=%2, 排序规则=%3)").arg(dbName, charset, collation), LogLevel::Info);
相关推荐
像风一样!3 小时前
MySQL Galera Cluster部署如何实现负载均衡和高可用
数据库·mysql
last_zhiyin4 小时前
Oracle sql tuning guide 翻译 Part 6-4 --- Hint使用准则和Hint使用报告
数据库·sql·oracle·sql tunning
chenchihwen5 小时前
AI代码开发宝库系列:FAISS向量数据库
数据库·人工智能·python·faiss·1024程序员节
小光学长5 小时前
基于Vue的课程达成度分析系统t84pzgwk(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
摇滚侠6 小时前
全面掌握PostgreSQL关系型数据库,备份和恢复,笔记46和笔记47
java·数据库·笔记·postgresql·1024程序员节
周杰伦fans6 小时前
Navicat - 连接 mysql 、 sqlserver 数据库 步骤与问题解决
数据库·mysql·sqlserver
码以致用7 小时前
StarRocks笔记
数据库·starrocks·olap·1024程序员节
auspicious航7 小时前
PostgreSQL数据库关于pg_rewind的认识
数据库·postgresql·oracle
武子康8 小时前
Java-159 MongoDB 副本集容器化 10 分钟速查卡|keyfile + –auth + 幂等 init 附 docker-compose
java·数据库·mongodb·docker·性能优化·nosql·1024程序员节
zz-zjx8 小时前
MySQL 索引深度指南:原理 · 实践 · 运维(适配 MySQL 8.4 LTS)
运维·数据库·mysql