看到一篇关于Qt使用Sqlite的教程贴, 稍微改了下封装起来
原帖地址: https://www.cnblogs.com/xia-weiwen/archive/2017/05/04/6806709.html
遇到一个头疼的bug, 调试了一个上午
//bug 需要在方法中重新定义, 不然会出现 "Driver not loaded" 的错误
QSqlQuery sql_query;
这个对象要在类成员函数中定义,不能在头文件声明,不然会出现找不到驱动的错误

我也不知道为什么
开始贴代码
文件目录

main.cpp
#include <QtCore/QCoreApplication>
#include "sqlitehelper.h"
#include <QDebug>
#include <QStringList>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
void dbTest();
void dbTest1();
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);
dbTest();return a.exec();
}
void dbTest()
{// 枚举可用驱动
qDebug() << QSqlDatabase::drivers();
SqliteHelper sqliteHelper;
sqliteHelper.createDatabase(); sqliteHelper.open();int ID;
ID = sqliteHelper.getMaxId();
QString cmd;
cmd = QString("INSERT INTO Log VALUES(%1, 0, '2018/5/24', '', '')").arg(ID + 1);
qDebug() << cmd;
sqliteHelper.insert(cmd); sqliteHelper.close();}
sqliteHelper.h
#ifndef SQLITEHELPER_H
#define SQLITEHELPER_H
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
class SqliteHelper
{public:SqliteHelper();
void createDatabase();
void createDataTable();
void open();
void close();
int insert(QString cmd);
void update();
void query();
void deleteRecord();
int getMaxId();
private:QSqlDatabase database;
QSqlQuery sql_query; //bug 需要在方法中重新定义, 不然会出现 "Driver not loaded" 的错误
int max_id;
};
#endif // SQLITEHELPER_H
sqliteHelper.cpp
#include "sqlitehelper.h"
#include <QDebug>
#include <QStringList>
SqliteHelper::SqliteHelper()
{max_id = 0;
}
void SqliteHelper::createDatabase()
{// create database
if (QSqlDatabase::contains("qt_sql_default_connection"))
{database = QSqlDatabase::database("qt_sql_default_connection");
}else
{database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName("log.sqlite");
// database.setUserName("");
// database.setPassword("");
}}
void SqliteHelper::createDataTable()
{QString create_sql = "create table Log (ID int primary key, Type int, Time varchar(32), Content varchar(32), Note varchar(128))";
sql_query.prepare(create_sql);
if(!sql_query.exec())
{qDebug() << "Error: Fail to create table." << sql_query.lastError();
}else
{qDebug() << "Table created!";
}}
void SqliteHelper::open()
{if (!database.open())
{qDebug() << "Error: Failed to connect database." << database.lastError();
}else
{qDebug() << "Open database successfully." ;
// do something
}}
void SqliteHelper::close()
{database.close();
}
int SqliteHelper::insert(QString cmd)
{// QString insert_sql = "insert into Log values (?, ?, ?)";
// sql_query.prepare(insert_sql);
// sql_query.addBindValue(max_id+1);
// sql_query.addBindValue("Wang");
// sql_query.addBindValue(25);
// if(!sql_query.exec())
// {
// qDebug() << sql_query.lastError();
// }
// else
// {
// qDebug() << "inserted Wang!";
// }
QSqlQuery sql_query;
if(!sql_query.exec(cmd))
{qDebug() << sql_query.lastError();
return 0;
}else
{qDebug() << "inserted successfully.";
return 1;
}}
int SqliteHelper::getMaxId()
{QSqlQuery sql_query;
QString select_max_sql = "select max(ID) from Log";
sql_query.prepare(select_max_sql);if(!sql_query.exec())
{qDebug() << sql_query.lastError();
}else
{while(sql_query.next())
{max_id = sql_query.value(0).toInt();
qDebug() << QString("max id:%1").arg(max_id);
return max_id;
} }}
文档文件
这里有个问题是相对路径
log.sqlite
在调试时会默认根目录(即release的上层目录)为当前目录
在Release中运行exe默认根目录则是在Release里
同样, Debug也是

数据库插入建表和插入数据后

字段类型

本文介绍了如何在Qt环境中使用SqliteHelper、QSqlDatabase和QSqlQuery进行数据库操作。作者在实践中遇到一个关于对象定义位置的bug,经过调试发现这些对象必须在类成员函数中定义,否则会出现找不到驱动的问题。文中还提供了代码目录结构,包括main.cpp、sqliteHelper.h和sqliteHelper.cpp,并提到了数据库文件log.sqlite的路径问题及其在不同模式下运行时的根目录变化。
419

被折叠的 条评论
为什么被折叠?



