#include "DataManage.h"
#include <QDebug>
#include <QFileInfo>
#include <QSqlDatabase>
#include <QSqlQuery>
#include "Config.h"
QAtomicPointer<DataManage> DataManage::m_instance = 0;
QMutex DataManage::m_mutex;
DataManage::DataManage(QObject *parent)
: QObject(parent)
{
createDatabase();
}
DataManage *DataManage::instance()
{
#ifndef Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE
if(!QAtomicPointer::isTestAndSetNative())//运行时检测
qDebug() << "Error: TestAndSetNative not supported!";
#endif
/*!
* 使用双重检测。
* testAndSetOrders操作保证在原子操作前和后的的内存访问
* 不会被重新排序。
*/
if(m_instance.testAndSetOrdered(0, 0))//第一次检测
{
QMutexLocker locker(&m_mutex);//加互斥锁。
m_instance.testAndSetOrdered(0, new DataManage);//第二次检测。
}
return m_instance;
}
QSqlDatabase *DataManage::getDb()
{
return &m_db;
}
int DataManage::getCurrRow(const QString &table)
{
int count = -1;
QString tmp = QString("SELECT count(ROWID) FROM %1;").arg(table);
QSqlQuery query(m_db);
query.exec(tmp);
if (query.next())
{
count = query.value(0).toInt();
}
qDebug() << "Table " << table << " count = " << count;
return count;
}
bool DataManage::createDatabase()
{
QString databaseName(DATABASE_NAME);
QFileInfo info(databaseName);
bool isExits = info.exists();
m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName(databaseName); //设置数据源名称
m_db.setUserName(DATABASE_USER); //登录用户
m_db.setPassword(DATABASE_PSWD);
m_isDbOpened = m_db.open();
if (!m_isDbOpened)
{
qDebug() << "数据库打开失败";
return false;
}
if (!isExits)
{
QSqlQuery query(m_db);
bool ok = false;
/*课程表
CREATE TABLE "schedule" (
"id" INTEGER NOT NULL UNIQUE,
"subject" TEXT NOT NULL,
"credit" NUMERIC NOT NULL,
PRIMARY KEY("id" AUTOINCREMENT)
);
*/
ok = query.exec("CREATE TABLE 'schedule' (\
'id' INTEGER NOT NULL UNIQUE,\
'subject' TEXT NOT NULL,\
'credit' NUMERIC NOT NULL,\
PRIMARY KEY('id' AUTOINCREMENT));\
");
if (!ok)
{
qWarning() << "[ERRPR]CREATE TABLE 'schedule'";
return false;
}
ok = query.exec("INSERT INTO 'main'.'schedule' ('subject', "
"'credit') VALUES ('高数', '3');");
if (!ok)
{
qWarning() << "[ERRPR]INSERT INTO 'main'.'schedule'(高数)";
return false;
}
ok = query.exec("INSERT INTO 'main'.'schedule' ('subject', "
"'credit') VALUES ('英语', '2');");
if (!ok)
{
qWarning() << "[ERRPR]INSERT INTO 'main'.'schedule'(英语)";
return false;
}
ok = query.exec("INSERT INTO 'main'.'schedule' ('subject', "
"'credit') VALUES ('操作系统', '3');");
if (!ok)
{
qWarning() << "[ERRPR]INSERT INTO 'main'.'schedule'(操作系统)";
return false;
}
ok = query.exec("INSERT INTO 'main'.'schedule' ('subject', "
"'credit') VALUES ('计算机网络', '3');");
if (!ok)
{
qWarning() << "[ERRPR]INSERT INTO 'main'.'schedule'(计算机网络)";
return false;
}
/*学生信息
CREATE TABLE "student" (
"id" INTEGER NOT NULL UNIQUE,
"name" TEXT NOT NULL,
"gender" TEXT NOT NULL,
"addr" TEXT NOT NULL,
"phone" TEXT,
"class" TEXT NOT NULL,
PRIMARY KEY("id" AUTOINCREMENT)
);
*/
ok = query.exec("CREATE TABLE 'student' ( \
'id' INTEGER NOT NULL UNIQUE,\
'name' TEXT NOT NULL,\
'gender' TEXT NOT NULL,\
'addr' TEXT NOT NULL,\
'phone' TEXT,\
'class' TEXT NOT NULL,\
PRIMARY KEY('id' AUTOINCREMENT)\
);");
if (!ok)
{
qWarning() << "[ERRPR]CREATE TABLE 'student'";
return false;
}
query.exec(
"INSERT INTO 'main'.'student' ('name', 'gender', 'addr', "
"'phone', 'class') VALUES ('张三', '男', '北京市昌平区', "
"'13188888888', '产业互联网学院1902班');");
query.exec(
"INSERT INTO 'main'.'student' ('name', 'gender', 'addr', "
"'phone', 'class') VALUES ('李四', '男', '北京市昌平区', "
"'13188888880', '产业互联网学院1902班');");
query.exec(
"INSERT INTO 'main'.'student' ('name', 'gender', 'addr', "
"'phone', 'class') VALUES ('王五', '男', '北京市昌平区', "
"'13188888880', '产业互联网学院1902班');");
query.exec(
"INSERT INTO 'main'.'student' ('name', 'gender', 'addr', "
"'phone', 'class') VALUES ('赵六', '男', '北京市昌平区', "
"'13188888880', '产业互联网学院1902班');");
/* 成绩单
CREATE TABLE "transcript" (
"id" INTEGER NOT NULL UNIQUE,
"student_id" INTEGER NOT NULL,
"schedule_id" INTEGER NOT NULL,
"score" NUMERIC NOT NULL,
FOREIGN KEY("student_id") REFERENCES "student"("id") on delete
cascade on update cascade, FOREIGN KEY("schedule_id") REFERENCES
"schedule"("id") on delete cascade on update cascade, PRIMARY
KEY("id" AUTOINCREMENT)
)
*/
ok = query.exec("CREATE TABLE 'transcript' (\
'id' INTEGER NOT NULL UNIQUE,\
'student_id' INTEGER NOT NULL,\
'schedule_id' INTEGER NOT NULL,\
'score' NUMERIC NOT NULL,\
FOREIGN KEY('student_id') REFERENCES 'student'('id') on delete cascade on update cascade,\
FOREIGN KEY('schedule_id') REFERENCES 'schedule'('id') on delete cascade on update cascade,\
PRIMARY KEY('id' AUTOINCREMENT)\
);");
if (!ok)
{
qWarning() << "[ERRPR]CREATE TABLE 'transcript'";
return false;
}
// 张三的成绩
query.exec("INSERT INTO 'main'.'transcript' ('student_id', "
"'schedule_id', 'score') VALUES ('1', '1', '91');");
query.exec("INSERT INTO 'main'.'transcript' ('student_id', "
"'schedule_id', 'score') VALUES ('1', '2', '92');");
query.exec("INSERT INTO 'main'.'transcript' ('student_id', "
"'schedule_id', 'score') VALUES ('1', '3', '93');");
query.exec("INSERT INTO 'main'.'transcript' ('student_id', "
"'schedule_id', 'score') VALUES ('1', '4', '94');");
// 李四的成绩
query.exec("INSERT INTO 'main'.'transcript' ('student_id', "
"'schedule_id', 'score') VALUES ('2', '1', '59');");
query.exec("INSERT INTO 'main'.'transcript' ('student_id', "
"'schedule_id', 'score') VALUES ('2', '2', '67');");
query.exec("INSERT INTO 'main'
没有合适的资源?快使用搜索试试~ 我知道了~
毕业设计:学生管理系统源码,界面为Qt,数据库为sqlite 代码里可以借鉴 sql 语句的操作
共34个文件
cpp:13个
h:12个
png:5个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 136 浏览量
2022-06-19
16:49:20
上传
评论 2
收藏 118KB ZIP 举报
温馨提示
毕业设计:学生管理系统源码,界面为Qt,数据库为sqlite 代码里可以借鉴 sql 语句的操作
资源推荐
资源详情
资源评论
收起资源包目录
StudentManagementSystem.zip (34个子文件)
StudentManagementSystem
qrc
image.qrc 252B
image
loyout.png 4KB
count.png 2KB
logo.png 80KB
query.png 5KB
manage.png 3KB
logo.ico 4KB
main
main.cpp 174B
Config.cpp 82B
Config.h 348B
StudentManage.cpp 639B
StudentManage.h 518B
sql
StudentManagementSystem.pro 2KB
core
DataManage.h 586B
DataManage.cpp 9KB
gui
ManagWgt.cpp 844B
QueryWgt.h 1021B
StudentWgt.h 364B
ManagWgt.h 532B
ScheduleWgt.h 369B
MainWindow.cpp 4KB
StudentWgt.cpp 2KB
LoginWgt.h 797B
QueryWgt.cpp 6KB
MainWindow.h 1KB
ScheduleWgt.cpp 1KB
LoginWgt.cpp 3KB
TranscriptWgt.h 589B
SqlWgtBase.h 1KB
CountWgt.cpp 4KB
MainWindow.ui 723B
SqlWgtBase.cpp 5KB
CountWgt.h 853B
TranscriptWgt.cpp 2KB
共 34 条
- 1
资源评论
郭老二
- 粉丝: 6w+
- 资源: 52
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- MyBatis 动态 SQL:灵活而强大的查询构建器.pdf
- com.accordion.prettyo.apk
- 毕业设计:基于SSM的mysql-ssm软件bug管理系统(源码 + 数据库 + 说明文档)
- MTSQL8.0.35windows(64bit)-mysql-installer-community-8.0.35.0
- 人工智能引领音乐创作新时代之Suno AI
- Public-bicycle-usage-forecast-master.zip
- 通道处理过程模拟:从理论到实践.pdf
- 数据库第七次作业E-R图第一题
- 大厂面试真题Java语法基础面试专题及答案
- IMG20240428211124.jpg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功