数据库建立库-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);
相关推荐
偶像你挑的噻10 小时前
3.Qt-基础布局以及事件
开发语言·数据库·qt
Dxy123931021610 小时前
MySQL如何做读写分离架构
数据库·mysql·架构
毕设十刻11 小时前
基于Vue的考勤管理系统8n7j8(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
合方圆~小文12 小时前
不同画面,三个镜头实时监控拍摄方案
数据结构·数据库·人工智能
ChrisitineTX13 小时前
凌晨突发Java并发问题:synchronized锁升级导致接口超时,排查过程全记录
java·数据库·oracle
极限实验室13 小时前
Easysearch 2.0.0 性能测试
数据库·性能优化
老华带你飞13 小时前
社团管理|基于Java社团管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
shayudiandian14 小时前
用LangChain打造你自己的智能问答系统
java·数据库·langchain
马克学长14 小时前
SSM特殊教育学校学生管理系统002k1(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·学生管理系统·特殊教育·ssm 框架
卿雪15 小时前
Redis 线程模型:Redis为什么这么快?Redis为什么引入多线程?
java·数据库·redis·sql·mysql·缓存·golang