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

库的建立需要预先声明库的库名和选择字符集以及库内的排序顺序
代码部分逻辑
一、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_conn 是skySQL 类的成员变量 ,用于在整个类中共享 "当前活跃连接" - 这一步是 "连接成功的关键"------ 后续新建数据库必须依赖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);