简介基于SQL Server与Qt实现的学生管理系统是面向计算机相关专业在校生、教师及企业开发者的课程设计与毕业设计参考源码。项目以C/Qt搭建前端界面后端对接SQL Server数据库覆盖学生信息、家庭情况、民族与学校字典、金额操作等常见管理模块代码经测试可正常运行也可在此基础上二次开发实现其他管理功能。压缩包共56个文件以10个cpp源文件、9个h头文件和9个ui界面文件为主体配合22张png界面截图、工程配置文件pro/qrc/user及README说明文档整体约209KB目录结构与模块对应清晰适合边看代码边对照界面理解运行逻辑。目前已有112人学习下载压缩包内附带完整源码、界面布局与运行说明建议先阅读README再结合截图还原项目全貌无论用于课程设计、毕业设计还是入门学习都能作为SQL Server与C/Qt整合开发的实用范本。1. 先别急着跑这个 SQL Server Qt 学生管理系统到底值在哪这套源码打包里真正值钱的不是那几个 UI 界面而是把 SQL Server 和 Qt 拼接起来的那条完整链路。学生管理系统这个题目太常见了常见到很多人的课设就是拿网上的 Python MySQL 改一改但如果你所在专业的课程设计、毕设指定了 SQL Server C这套基于 Qt Widgets 的工程就正好对位主窗口负责导航addfamily、addschool、addbody、addmoney 这些表单分别录入家庭、学校、体检和缴费信息确认删除和查询预览也都有对应模块。它适合三类人刚学完 C 想看看真正工程怎么组织文件的人正在做课设、毕设需要一套能跑通增删改查底子的人以及手头有 SQL Server 作业、想找个现成界面改功能的人。下面按“工程结构 → 搭环境 → 跑通 → 改功能 → 踩坑”的顺序拆每一步都给出能直接照抄的做法。2. 工程拆解从 SQL.pro 到八个界面文件先搞清楚谁在干活拿到这份资源第一件事不是双击运行而是先看文件结构。压缩包里除了一张 README.md 和一堆截图之外真正的源码是 main.cpp、mainwindow.cpp/h、dialog.cpp/h以及 addfamily、addschool、addrace、addbody、addmoney 五个带 .ui 的添加表单外加 areyousure 确认框、inputview 查询视图和 images.qrc 资源文件。这属于典型的 Qt Widgets 单工程结构一个 .pro 管所有源文件一个主窗口做聚合若干个 QDialog 做细分数据的录入。2.1 文件清单与模块分工哪些是壳、哪些是业务、哪些是资源我把关键文件按职责拆了一张表这样你拿到手能快速定位改哪里文件类型职责SQL.pro工程文件声明 QT widgets sql列出所有源文件和 .uimain.cpp入口new MainWindow设置窗口标题后 showmainwindow.cpp/h主窗口数据库初始化、列表加载、导航跳转dialog.cpp/h通用对话框放置公共逻辑比如各类信息展示窗口addfamily.ui/cpp/h表单家庭信息录入家长姓名、电话、住址等addschool.ui/cpp/h表单学校信息录入校名、地址、联系人addrace.ui/cpp/h表单民族信息维护常用于下拉框数据源addbody.ui/cpp/h表单体检信息录入身高、体重、视力、日期addmoney.ui/cpp/h表单缴费记录录入金额、项目、缴费日期areyousure.ui/cpp/h确认框删除前的二次确认返回 Accepted/Rejectedinputview.ui/cpp/h视图查询预览列表主窗口里嵌的核心数据展示区images.qrc资源打包窗口图标和按钮图片模块之间的调用关系很直白mainwindow 是最外层容器按钮点击后通过 exec() 弹出 add 系列对话框对话框内部完成 INSERT 或 UPDATE关闭后主窗口再刷新 inputview。areyousure 是模态确认框独立于任何业务表好处是删除学号、删除缴费记录都能复用它不用每个模块各写一个 QMessageBox::question。这套组织方式最大的优点是把“界面”和“表结构”一一对应了。addfamily 对应 Family 表addmoney 对应 Payment 表你改表结构时能顺着文件找到所有受影响的地方比那种十几张表共用一个巨无霸窗口的设计好维护得多。2.2 从 add 系列界面反推 SQL Server 表结构六张表怎么建不用打开源码里的建表脚本光看 add 系列的命名就能猜出数据库至少有这几张表学生主表 Student家庭表 Family学校表 School民族表 Nation体检表 BodyInfo缴费表 Payment。学生主表作为核心通过学号关联其他表。建表脚本我按 SQL Server 的常用写法整理如下字段名和界面上的中文标签要能对上CREATE DATABASE StudentDB COLLATE Chinese_PRC_CI_AS; GO USE StudentDB; GO CREATE TABLE Nation ( nation_id INT IDENTITY(1,1) PRIMARY KEY, nation_name NVARCHAR(50) NOT NULL ); CREATE TABLE Family ( family_id INT IDENTITY(1,1) PRIMARY KEY, father_name NVARCHAR(50), mother_name NVARCHAR(50), phone NVARCHAR(20), address NVARCHAR(200) ); CREATE TABLE School ( school_id INT IDENTITY(1,1) PRIMARY KEY, school_name NVARCHAR(100) NOT NULL, school_addr NVARCHAR(200), contact_tel NVARCHAR(20) ); CREATE TABLE Student ( stu_no NVARCHAR(20) PRIMARY KEY, stu_name NVARCHAR(50) NOT NULL, gender NVARCHAR(10), birthday DATE, nation_id INT, family_id INT, school_id INT, CONSTRAINT FK_Student_Nation FOREIGN KEY (nation_id) REFERENCES Nation(nation_id), CONSTRAINT FK_Student_Family FOREIGN KEY (family_id) REFERENCES Family(family_id), CONSTRAINT FK_Student_School FOREIGN KEY (school_id) REFERENCES School(school_id) ); CREATE TABLE BodyInfo ( body_id INT IDENTITY(1,1) PRIMARY KEY, stu_no NVARCHAR(20) NOT NULL, height DECIMAL(5,2), weight DECIMAL(5,2), vision NVARCHAR(20), check_date DATE, CONSTRAINT FK_BodyInfo_Student FOREIGN KEY (stu_no) REFERENCES Student(stu_no) ); CREATE TABLE Payment ( pay_id INT IDENTITY(1,1) PRIMARY KEY, stu_no NVARCHAR(20) NOT NULL, pay_item NVARCHAR(100), pay_amount DECIMAL(10,2), pay_date DATE, CONSTRAINT FK_Payment_Student FOREIGN KEY (stu_no) REFERENCES Student(stu_no) );建库那行 COLLATE Chinese_PRC_CI_AS 很关键它可以避免后面界面中文全部变成问号的悲剧。字段选择上学号用 NVARCHAR 而不是 INT是因为很多学校的学号带字母和前缀数字类型存不下金额和身高体重用 DECIMAL 而不是 FLOAT是因为浮点计算会产生 0.00001 这种尾差做统计时很难看。外键约束我建议保留虽然插入时效率略降但能保证不会出现“体检记录指向一个不存在的学生”这种脏数据。2.3 选型理由为什么是 SQL Server 而不是 SQLite 或 MySQL我知道很多人在网上抄的课设是 SQLite 或者 MySQL但这份工程选择 SQL Server 是有现实原因的。机房和实验室的机器普遍装了 SQL Server导师演示时用 SSMS 打开就能看数据而 SQLite 只有一个文件很多老师不认。对比一下三种方案的处境数据库驱动名典型坑适合场景SQL ServerQODBCODBC 驱动版本、SSL 加密、实例名课设、毕设、企业内网系统MySQLQMYSQL驱动插件经常编译缺失UTF-8 乱码Web 后台配套、Linux 服务器SQLiteQSQLITE多用户并发差无账号权限单机小工具、快速原型Qt 侧通过 QSqlDatabase 抽象层操作数据库addDatabase 第一个参数传的是 Qt 的驱动名比如 QODBC、QMYSQL、QSQLITE。这里注意别混淆两个概念“QODBC”是 Qt 框架内建的驱动插件“ODBC Driver 17 for SQL Server”是微软提供的 ODBC 驱动程序前者负责把 Qt 的 SQL 调用转成 ODBC 标准接口后者才真正和 SQL Server 实例通信。连接串里写的是后者。选 SQL Server 还有一个务实的好处权限体系完整。你可以用 sa 账号只给这个库的 db_owner 权限不暴露整个实例这样交作业时不用把数据库密码也交出去。后面第 5 章我会专门说新版 ODBC 驱动因为 SSL 加密默认开启导致的连接失败那是最容易让人怀疑人生的地方。3. 把工程跑起来Qt Creator、ODBC 驱动与 SQL Server 的最小配置很多同学卡在编译这一步其实不是代码问题而是环境组合没对上。我建议的配置组合是Qt 5.15.2 MSVC2017_64 编译器 SQL Server 2019/2022 Developer 版 SSMS。Qt 版本和编译器必须匹配这是第一条纪律用 MinGW 套件编译虽然也能出界面但遇到 QODBC 插件加载失败的概率明显更高后面我会解释。3.1 环境版本怎么选为什么是 Qt 5.15.2 配 MSVC2017_64Qt 版本和编译器套件是一一对应的。打开 Qt Creator 的 Kits 页面你会看到 Desktop Qt 5.15.2 MSVC2017_64 和 Desktop Qt 5.15.2 MinGW 8.1.0 这类条目它们用的是同一套 Qt 源码编译出的不同二进制互相不能混用。这个工程既然要对接 SQL Server我建议直接用 MSVC 套件理由和 ODBC 插件有关Qt 在 Windows 上自带的 QODBC 插件很多是用 MSVC 预编译的MinGW 环境偶尔会碰到 plugins/sqldrivers 里找不到 qsqlodbc.dll 的情况编译时也不报错运行时才告诉你 driver not loaded这个坑我在第 5 章详细说。版本选择上Qt 5.15.2 是目前兼容性最稳的 LTS 后期版本网上能找到的资料最多。SQL Server 不用纠结具体版本2019 和 2022 都行Developer 版免费且功能和 Enterprise 一样。安装 SQL Server 时建议把“数据库引擎服务”和“客户端工具连接”勾上SSMS 单独安装别用安装包里自带的精简工具。建好环境后用 Qt Creator 打开 SQL.pro第一步先看工程文件里QT core gui sql这一行有没有 sql。.pro文件里声明了 sql 模块Qt 才会去链接 Qt5Sql.lib否则编译时会出现一堆unresolved external symbol错误。我一般会顺手在QT 那行后面加上widgets虽然新工程默认有但从网上下载的工程经常省略这行。3.2 在 SSMS 里建库建表先把数据层跑通连接数据库之前我习惯先在 SSMS 里把库和表建好确认 SQL Server 本身没问题再回头调 Qt 代码。这样做能减少变量如果 Qt 连不上问题只可能在 Qt 侧或 ODBC 配置侧不用怀疑数据库没起来。按第 2.2 节的脚本在 SSMS 里新建查询执行一遍。执行完展开数据库看表是否都生成了。然后右键数据库新建一个“ODBC 数据源测试”打开 Windows 的 ODBC 数据源管理器选“系统 DSN”添加一个 SQL Server 或 ODBC Driver 17 for SQL Server 的条目服务器填127.0.0.1,1433数据库选 StudentDB测试连接。这里能通说明数据库层面没问题。连接测试有个细节如果你的 SQL Server 是默认实例服务器可以填.或者localhost如果是命名实例要写成机器名\实例名或者ip,端口的形式。很多人在这一步填错Qt 报的错却非常抽象一度让我以为是自己代码写错了。顺手验证一下服务是否启动WinR 输入 services.msc找到 SQL Server (MSSQLSERVER)状态应该是“正在运行”。3.3 修改连接参数并完成首次编译源码里数据库连接多半写在 mainwindow.cpp 或 dialog.cpp 的构造函数里下断点或者直接搜 QSqlDatabase 就能找到。我一般会把它抽成一个独立函数方便调试#include QSqlDatabase #include QSqlError #include QDebug bool initDatabase() { QSqlDatabase db QSqlDatabase::addDatabase(QODBC); db.setDatabaseName( Driver{ODBC Driver 17 for SQL Server}; Server127.0.0.1,1433; DatabaseStudentDB; Trusted_ConnectionYes; Encryptno; TrustServerCertificateyes;); if (!db.open()) { qDebug() open database error: db.lastError().text(); return false; } return true; }这段代码里addDatabase(QODBC)指定 Qt 侧驱动setDatabaseName传的是一整条 ODBC 连接串而不是数据库名。这条连接串的每段都有意义Driver指定微软提供的 ODBC 驱动Server里的127.0.0.1是本机1433是 SQL Server 默认端口Trusted_ConnectionYes表示用 Windows 当前用户身份登录免去在代码里写死Uid和Pwd如果要用 SQL Server 账号就把这一项换成Uidsa;Pwd密码;Encryptno和TrustServerCertificateyes是专治新版 ODBC 驱动 SSL 报错的第 5 章会展开。改完后直接构建运行。Qt Creator 里选 MSVC 套件点击运行如果编译通过但界面弹出连接失败先别急着改代码回到第 3.2 步的 ODBC 数据源管理器测试两边报错信息对比着看到底是谁的问题。命令行方式也一样先qmake SQL.pro生成 Makefile再nmake编译出错时看第一行错误Qt 的编译错误提示往往到最后那几行才是最根本的原因。4. 核心代码走读增删改查与表单联动是怎么串起来的这个工程的业务逻辑不算复杂核心就是把“主窗口刷新列表”和“对话框增删改”串起来。我挑三个最值得看的点展开主窗口初始化、add 系列对话框提交、areyousure 二次确认。4.1 主窗口初始化从连接数据库到列表刷新主窗口构造函数里通常这么写初始化数据库、创建 QStandardItemModel 作为表格模型、调用加载函数填充 View。下面是常见写法你可以对照源码找同样逻辑// MainWindow 构造里调用 void MainWindow::initWindows() { if (!initDatabase()) { QMessageBox::critical(this, 错误, 数据库连接失败请检查 SQL Server 配置); return; } model new QStandardItemModel(this); ui-tableView-setModel(model); loadStudentList(); } void MainWindow::loadStudentList() { QSqlQuery query; query.exec(SELECT stu_no, stu_name, gender, birthday FROM Student ORDER BY stu_no); model-clear(); model-setHorizontalHeaderLabels( QStringList() 学号 姓名 性别 出生日期); while (query.next()) { QString stuNo query.value(0).toString(); QString stuName query.value(1).toString(); QString gender query.value(2).toString(); QString birthday query.value(3).toDate().toString(yyyy-MM-dd); QListQStandardItem* row; row new QStandardItem(stuNo) new QStandardItem(stuName) new QStandardItem(gender) new QStandardItem(birthday); model-appendRow(row); } }QSqlQuery默认使用当前线程里最后一个打开的数据库连接所以不用每次手动指定。query.value(0)按列索引取值顺序和 SELECT 里的字段顺序一致生日是 DATE 类型Qt 读到的是 QVariant用toDate().toString(yyyy-MM-dd)保证显示格式不要直接 toString否则可能带出T和时区尾巴。model-clear()只清数据表头需要重新 setHorizontalHeaderLabels这是新手最容易漏的漏了会导致第一次加载有表头第二次刷新后表头消失。4.2 addbody 与 addfamily 这类录入对话框的提交套路add 系列对话框通用套路是界面用 .ui 拖好 QLineEdit、QSpinBox、QDateEdit确定按钮的槽函数里拼接 SQL 执行。我以 addbody 体检录入为例用带参数绑定的写法这是比你直接拼 QString 稳妥得多的方式void AddBodyDialog::onSave() { QSqlQuery query; query.prepare(INSERT INTO BodyInfo (stu_no, height, weight, vision, check_date) VALUES (?, ?, ?, ?, ?)); query.addBindValue(ui-stuNoEdit-text().trimmed()); query.addBindValue(ui-heightSpin-value()); query.addBindValue(ui-weightSpin-value()); query.addBindValue(ui-visionEdit-text().trimmed()); query.addBindValue(QDate::currentDate().toString(yyyy-MM-dd)); if (!query.exec()) { QMessageBox::warning(this, 保存失败, query.lastError().text()); return; } this-accept(); }prepare加addBindValue的本质是把数据通过 ODBC 参数接口传给 SQL Server而不是把字符串拼进 SQL 再发给服务端。这样有两个好处一是用户在国家或姓名框里输入单引号、百分号时不会破坏 SQL 语法也就是防注入二是中文内容经过正确编码传输乱码率大幅降低。高度和体重的 QSpinBox 返回的是 int金额字段如果是 QDoubleSpinBox注意小数位数设置SQL Server 的 DECIMAL(10,2) 对应两位小数。如果要做编辑把 INSERT 换成 UPDATE并且 WHERE 后面加主键条件比如WHERE body_id ?再绑定当前选中行的 body_id。对话框点击保存后调用accept()主窗口里通过if (dlg.exec() QDialog::Accepted) loadStudentList();来判断到底刷新不刷新列表。这里有个容易踩的小坑exec()是阻塞的但后面的代码在对话框关闭后才会执行如果你忘了判断返回值用户点了“取消”也会刷新列表虽然结果没错但会给用户造成“我没保存啊怎么列表变了”的错觉。4.3 areyousure 确认框把删除操作做成强制二次确认删除数据是不可逆操作所以工程里单独做了一个 areyousure 对话框而不是直接用 QMessageBox 的默认按钮。加这一层的目的不是UI好看而是防止鼠标误点列表里选中一行按删除键本来是很顺手的事如果没有确认框一行数据就没了而且 SQL Server 里外键关联的 BodyInfo、Payment 记录可能也被级联删掉。调用方式通用删除任何一张表都用同一个确认框Areyousure dlg(this); if (dlg.exec() ! QDialog::Accepted) { return; // 用户选了取消什么都不做 } QSqlQuery query; query.prepare(DELETE FROM Student WHERE stu_no ?); query.addBindValue(currentStuNo); if (query.exec()) { loadStudentList(); }我这里补充一个源码里很可能没有但实战非常需要的点多表关联删除。Student 主表被 BodyInfo、Payment 通过外键引用仅删除主表会在外键检查时报错。正确顺序是先删子表再删主表或者把几个 DELETE 包进事务防止删了一半程序崩溃留下孤儿数据BEGIN TRANSACTION; DELETE FROM BodyInfo WHERE stu_no 2023001; DELETE FROM Payment WHERE stu_no 2023001; DELETE FROM Student WHERE stu_no 2023001; COMMIT;确认框里文案最好带上当前操作对象的标识比如“确认删除学号为 2023001 的学生信息吗”不然用户连删的是谁都看不清。5. 避坑排查ODBC 连接失败、Qt 版本不匹配、中文乱码的 5 条血泪记录这一章是全篇含金量最高的部分每一条都是我实际跑课程设计类项目踩过的坑。学生管理系统本身不难写难的是环境组合千奇百怪数据库报错信息还经常误导人。5.1 现象QSqlDatabase: QODBC driver not loaded程序编译正常运行时打开数据库报QSqlDatabase: QODBC driver not loadedopen 失败。原因分两种一是安装 Qt 时没有勾选 Qt SQL 驱动模块plugins/sqldrivers 目录下根本没有 qsqlodbc.dll二是发布时只拷了 exe 和 dll忘了把 qsqlodbc.dll 放到项目运行目录的 sqldrivers 子文件夹下。解决开发环境下先检查 Qt 安装目录D:\Qt\5.15.2\msvc2017_64\plugins\sqldrivers看有没有 qsqlodbc.dll没有就重装 Qt 或在 MaintenanceTool 里勾选 Database Drivers 的 ODBC 子项。发布到别的机器时用windeployqt.exe 你的程序.exe自动拷贝依赖它会连插件目录一起带过去如果手工拷贝必须把整个 sqldrivers 目录放到 exe 同级不能少。我见过最诡异的情况是 qsqlodbc.dll 在但依赖的 Qt5Sql.dll 是 MinGW 版本的和主程序 MSVC 编译的不匹配运行时一样报驱动未加载。5.2 现象错误 08001证书链由不受信任的颁发机构颁发用 ODBC Driver 17/18 连接时报[Microsoft][ODBC Driver 17 for SQL Server]SSL 提供程序: 证书链是由不受信任的颁发机构颁发的或者客户端无法建立连接。网上搜这个错能搜出一堆长篇大论但多半是绕圈子。原因新版微软 ODBC 驱动默认把Encrypt加密设为 yes也就是要求对连接做 SSL 加密同时验证服务器证书。而默认安装的 SQL Server 用的是自签名证书不在系统信任列表里于是握手阶段直接失败。解决连接串末尾加两个参数第 3 章代码里我已经写了这里再强调一次db.setDatabaseName( Driver{ODBC Driver 17 for SQL Server}; Server127.0.0.1,1433; DatabaseStudentDB; Trusted_ConnectionYes; Encryptno; TrustServerCertificateyes;);Encryptno关闭强制加密TrustServerCertificateyes表示即使证书不可信也继续连接。这两个参数是配套的只加一个不保险。如果你用的 ODBC Driver 13 或更老版本这条报错通常不会出现所以也有人用“回退旧版本驱动”来解决但在新机器上装旧版驱动又容易触发第 5.5 条的问题。5.3 现象fatal: cannot mix incompatible Qt library (version ex50601) with this library编译时直接报fatal: cannot mix incompatible Qt library (version ex50601) with this librar有时候前面还跟着unknown module(s) in qt: webenginewidgets。原因Qt 版本和编译器套件混用。最典型的是解压了一个用 Qt 5.6.1 编译的工程然后用 Qt 5.15.2 的 MSVC 套件直接打开.pro 文件里的模块名和头文件路径对不上还有一种是 MinGW 编译的工程被强制切到 MSVC 套件或者反过来Qt 内部宏QT_VERSION_STR检查不通过。解决确认工程是哪个版本写的README 或 SQL.pro.user 文件里一般留有痕迹。如果工程是 MinGW 的就用 MinGW 套件打开并且同一套件下清理重新 qmake如果工程是 MSVC 的就统一用 MSVC 套件。最彻底的办法是把 build 目录整个删掉重新 qmake 再全量编译因为增量编译残留的 .o 文件里带着旧宏定义比全新编译更容易触发版本错乱。5.4 现象写入 SQL Server 的中文全部变成问号界面上显示正常但从 Qt 写入数据库后SSMS 里查出来是???反过来在 SSMS 里手工插入中文Qt 界面读到也是乱码。原因三层编码没对齐。第一层是源文件编码如果 .cpp 文件本身是 GBK 保存的Qt 5.15 默认按 UTF-8 解析字符串字面量中文 QT 字符串在编译期就已经乱了第二层是数据库排序规则默认安装的 SQL Server 可能是SQL_Latin1_General_CP1_CI_AS存不了中文第三层是 ODBC 传输编码老版本驱动对中文支持参差不齐。解决源文件统一 UTF-8Qt Creator 右下角有个编码菜单可以批量转换建库时强制用COLLATE Chinese_PRC_CI_AS第 2.2 节脚本里已经写了插入和查询都走参数绑定不要拼字符串。如果你是在老系统上排查还可以在连接串里加CharacterSetUTF8但新驱动一般不需要。判断是哪层的问题有个笨办法在 Qt 里qDebug() query.lastError()如果错误信息里中文本身是好的数据库里却是问号那问题在数据库排序规则如果错误信息里中文就是乱码那问题在源文件编码。5.5 现象SSMS 能连Qt 里连不上报驱动版本不兼容服务器是老机器SQL Server 2008/2012客户端机器却装了 ODBC Driver 17/18Qt 里报[08001]或者直接提示找不到数据源。原因新版 ODBC 驱动在握手协议上和新版 SQL Server 匹配良好但对 2008/2012 这类老实例的支持不够平滑尤其是默认加密行为变化后老实例不认识新驱动的加密协商请求。你可以在 ODBC 数据源管理器里测连接往往会发现“测试失败”但 SSMS 用旧协议却能连上这就是黑匣子一样的体验。解决这种情况别硬抗连接串里的Driver改回{SQL Server}注意是旧版驱动名或者安装SQL Server Native Client 11.0后改用{SQL Server Native Client 11.0}。代价是 SSL 加密会失效但在局域网课设环境里无所谓。反过来如果你连的是 SQL Server 2019/2022那优先用 ODBC Driver 17/18别提老驱动老驱动对新版 TLS 1.2 以上协议反而支持不好。一句话驱动版本跟随服务端版本走不要一路装最新。6. 进阶技巧把连接串拆出来、加登录日志、让数据库可以一键备份到这里工程已经能跑增删改查也通透了。但课设交付和实际部署之间还有一步距离谁都不想每次换机器就重新编译一次代码。下面这三个小改造花不了半小时却能大幅提升代码的可用性。第一连接串外置到 config.ini。把第 3.3 节的连接串从.cpp里挪到配置文件中程序启动时动态读取这样部署到别的机器只需要改 ini 文件里的服务器地址和数据库名不用动一行代码。读取方式用 QSettingsQSettings settings(config.ini, QSettings::IniFormat); QString server settings.value(db/server, 127.0.0.1).toString(); QString dbName settings.value(db/name, StudentDB).toString(); QString connect QString( Driver{ODBC Driver 17 for SQL Server}; Server%1;Database%2;Trusted_ConnectionYes;Encryptno; TrustServerCertificateyes;) .arg(server, dbName);第二给登录记录加日志表。按用户习惯补一张登录日志CREATE TABLE LoginLog ( log_id INT IDENTITY(1,1) PRIMARY KEY, user_name NVARCHAR(50), login_time DATETIME DEFAULT GETDATE() );登录成功后在 Qt 里执行一条 INSERT 即可。别小看这张表课设答辩时老师问“你系统有没有操作留痕”这就是现成的回答素材。第三用 QProcess 调用 sqlcmd 做一键备份。把数据库备份命令放在“备份”按钮的槽函数里省去手动开 SSMS 的麻烦QProcess::startDetached(sqlcmd, QStringList() -S 127.0.0.1 -E -Q BACKUP DATABASE StudentDB TO DISKD:/bak/StudentDB.bak);参数解释-S指定服务器-E表示使用 Windows 身份验证-Q后面跟要执行的 SQL 语句。这一招在答辩演示前跑一遍就算前面操作删错了数据也能立刻还原相当于给课设买了后悔药。有一回我把连接串直接写在构造函数里换了一台只改了实例名的机器愣是查了一晚上最后才发现问题出在驱动版本和Encrypt参数上而不是代码逻辑。从那以后我每次拿到别人的 Qt 工程都会先看 README 和 .pro再把数据库连接拆出来放 config.ini最后强制走一遍“新建-编辑-删除-查询”全流程才敢往下改。这套习惯帮我少踩了至少五个坑希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
网盘直链获取原理与本地化实践指南 1. 项目概述:为什么“免客户端下载”成了刚需,又为什么直链是唯一解“如何快速实现网盘免客户端下载:终极直链获取指南”——这个标题里藏着过去三年网盘生态最真实、最普遍、也最让人无奈的用户痛点。我从2019年开始做资源分发类项目&#x… · 2026/9/26 18:43:27
题争食图:从构图笔墨到题跋的写意花鸟创作复盘 “题争食图”这五个字,说白了就是一幅画的名字,但凡是认真画过几笔写意花鸟的人,看到这三个字大概都会心一笑——这是在传统题材里最常碰到的“戏核”。画面里几只鸡、一窝雀、几尾鱼,围着一点食抢来抢去,看起来简单&a… · 2026/9/26 18:43:20
桌面端ChatGPT登录报错排查指南:从环境到网络的全链路解析 1. 桌面端登录报错到底卡在哪一环 桌面版 ChatGPT 登录报错,是最近半年我在帮朋友处理电脑问题时遇到频率最高的一类。表现五花八门:有人是点开图标转两圈直接闪退,有人是卡在登录页反复提示“正在重新连接”,还有人干脆弹出一句 … · 2026/9/26 19:16:25
江苏安航船舶设备有限公司创新能力怎么样 深夜海面上的那束光,来自不停歇的创新凌晨的东海,一艘货轮在风浪中穿行。船员不慎落水的瞬间,随身搜救信标遇水,位置信息自动发出,四海里范围内的救援力量迅速锁定目标,从落水到获救,时间被压缩… · 2026/9/26 19:16:25
Atlas 300V 24G推理加速卡解读与YOLOv5部署实战指南 最近被问得最多的一个问题:Atlas 300V 24G 到底是不是运算加速卡,能不能直接拿来部署 YOLO?这问题看似一句话能回答,但真要把它讲清楚,得从硬件定位、软件工具链一直聊到模型转换和推理优化。这篇文章我打算把事情一次… · 2026/9/26 19:16:19
桌面端登录报错排查指南:从网络、配置到运行环境的完整链路 1. 桌面端登录报错到底卡在哪一环桌面版客户端登录报错,是很多人装完软件后遇到的第一个拦路虎。界面通常表现为转圈、白屏、提示"无法加载登录要求"或者干脆闪退,重装一遍还是老样子。这类问题的本质,绝大多数时候不是软件本身坏了… · 2026/9/26 19:16:19
装配制造行业 MES 系统物料齐套技术应用详解 1. 引言在装配制造行业,生产节拍高度依赖物料供应的准确性与及时性。与流程型制造不同,装配型产品通常由大量零部件按一定顺序组装而成,任何一个关键物料的缺失都可能导致整条产线停线、换型或临时插单,造成产能损失和交付延误。因… · 2026/9/26 19:16:13
AI-Agent时代-SQL与向量数据库-学习笔记-CSDN版 AI Agent 时代,SQL 会被 AI 取代吗?——SQLAI 结合路径的学习笔记 这是一篇学习笔记,记录我对「AI Agent 时代数据库查询语言未来」的完整思考: ① SQL 如何与 AI 结合并落地应用;② SQL 会不会被自然语言彻底取代、会不会出现新查询语言; ③ SQL 与向量数据库之间到底是… · 2026/9/26 19:16:13
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46