数据库建立库-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);
相关推荐
我是zxb2 小时前
EasyExcel:快速读写Excel的工具类
数据库·oracle·excel
代码不停3 小时前
MySQL联合查询
java·数据库·mysql
沐浴露z3 小时前
Redis内存回收:过期策略与淘汰策略
数据库·redis·缓存
宴之敖者、3 小时前
MySQL——数据库基础
数据库·mysql
张3蜂3 小时前
MongoDB BI Connector 详细介绍与使用指南(手动安装方式,CentOS 7 + MongoDB 5.0.5)
数据库·mongodb·centos
春时似衿里3 小时前
jmeter配置数据库连接步骤
数据库·jmeter
喵喵爱自由4 小时前
Ubuntu 24.04 Server 版系统安装及配置
数据库·ubuntu
hzzzzzo04 小时前
微服务保护全攻略:从雪崩到 Sentinel 实战
数据库·微服务·sentinel
J.Kuchiki4 小时前
【PostgreSQL内核学习:表达式】
数据库·postgresql