在上一节中,我们直接调用QSqlQuery:exec()对数据库进行增删改查等简单操作。
在项目开发中,为了实现系统的低耦合,我们就必须封装出一个数据库功能模块。
一、prepare()
首先创建一个头文件"attend_db.h"。
初始化数据库操作,包括创建数据库文件、建表、以及添加一些基础数据。最好还要返回数据库操作的一些信息(最重要的是错误信息)。
QSqlError db_Init()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:"); //使用内存数据库
if(!db.open())
{
//打开失败
return db.lastError();
}
QSqlQuery query;
//创建组别表,人员表,考勤记录表
if(!query.exec("CREATE TABLE table_group(group_id INTEGER PRIMARY KEY, group_name VARCHAR)"))
{
return query.lastError();
}
if(!query.exec("CREATE TABLE table_user(user_id VARCHAR PRIMARY KEY, group_id INTEGER)"))
{
return query.lastError();
}
if(!query.exec("CREATE TABLE table_record(user_id VARCHAR, datetime VARCHAR)"))
{
return query.lastError();
}
//添加组别数据
if(!query.prepare("INSERT INTO table_group(group_id, group_name) VALUES(:gourp_id, :group_name)"))
{
return query.lastError();
}
db_AddGroup(query, 1, "student");
db_AddGroup(query, 2, "teacher");
//添加人员数据
if(!query.prepare("INSERT INTO table_user(user_id, group_id) VALUES(:user_id, :group_id)"))
{
return query.lastError();
}
db_AddUser(query, "T0001", 2);
qdb_AddUser(query, "T0002", 2);
db_AddUser(query, "S111201", 1);
//添加考勤记录数据
if(!query.prepare("INSERT INTO table_record(user_id, datetime) VALUES(:user_id, :datetime)"))
{
return query.lastError();
}
db_AddRecord(query, "T0001", QDateTime::currentDateTime());
db_AddRecord(query, "T0002", QDateTime::currentDateTime());
db_AddRecord(query, "S111201", QDateTime::currentDateTime());
return QSqlError();
}
这里对表的添加数据不再简单的使用QSqlQuery:exec()直接执行语句了。为了模块化,我们还要封装出对表数据的操作函数(包括增删改查)。
提供对外的接口供上层应用使用。形参最好就仅仅是表的参量,这样清晰明了。
Qt提供了bool prepare(const QString& query)接口。(SQLite也提供了该API函数)
query.prepare("INSERT INTO table_group(group_id, group_name) VALUES(:gourp_id, :group_name)")
我们先使用了prepare()函数,在其中利用了“:group_id”和“:group_name”来代替具体的数据,之后就可以利用bindValue()函数给