数据库建立库-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);
相关推荐
恒悦sunsite4 小时前
Ubuntu之apt安装ClickHouse数据库
数据库·clickhouse·ubuntu·列式存储·8123
奥尔特星云大使4 小时前
MySQL 慢查询日志slow query log
android·数据库·mysql·adb·慢日志·slow query log
来自宇宙的曹先生4 小时前
MySQL 存储引擎 API
数据库·mysql
间彧5 小时前
MySQL Performance Schema详解与实战应用
数据库
间彧5 小时前
MySQL Exporter采集的关键指标有哪些,如何解读这些指标?
数据库
weixin_446260855 小时前
Django - 让开发变得简单高效的Web框架
前端·数据库·django
mpHH5 小时前
babelfish for postgresql 分析--todo
数据库·postgresql
zizisuo5 小时前
解决在使用Lombok时maven install 找不到符号的问题
java·数据库·maven
程序边界7 小时前
国产之光!金仓数据库KingbaseES Oracle兼容性深度体验大赏
数据库·oracle
A阳俊yi7 小时前
Spring——声明式事务
java·数据库·spring