QT操作sqlite数据库语句与mysql数据库雷同,这里不再赘述,请参考【QT-2】Qt连接及操作MySql数据库_qt连接mysql数据库-CSDN博客
sqlite数据库使用:
QSqlQuery sql_qurey;
//添加驱动
database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName("../3dvisionServer/project.db");
sql_qurey = QSqlQuery::QSqlQuery(database);
if (!database.open())
{
qDebug() << "Error:Failed to connect database!" << database.lastError();
}
else
{
qDebug() << "Link sucess!";
}
1、判断数据库中是否存在表
//project_conf为表名
bool isTableExist = sql_qurey.exec(QString("select * from project_conf"));
//返回true,则表存在;反之,表不存在
qDebug() << isTableExist;
2、QSqlQuery提供的常用方法
Qt对数据库的操作是通过QSqlQuery实现的,它可返回所有的执行结果。
next():指向下一条记录,每执行一次该函数,便指向相邻的下一条记录;
previous():指向上一条记录,每执行一次该函数,便指向相邻的上一条记录;
record():获得现在指向的记录;
first():指向结果集的第一条记录;
last():指向结果集的最后一条记录;
seek(int n):query指向结果集的第n条记录;
value(int n):获得属性值,其中n代表查询第n个属性,或者value("列名");
query.record().count():获取每条记录中属性(即列)的个数;
特别注意:将next()放在循环内,查询的记录从第二条开始。
3、在实践过程中的错误解决
错误1
QSqlQuery::exec: database not open
Error: Failed to create table! QSqlError("", "Driver not loaded", "Driver not loaded")
解决:
// 添加以下语句
sql_qurey = QSqlQuery::QSqlQuery(database);
错误2
Error: Failed to create table! QSqlError("1", "Unable to execute statement", "AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY")
错误代码:
QString sql_result = "create table result(result_id int PRIMARY KEY AUTOINCREMENT, result_silo_id int,\
result_max varchar,result_min varchar, result_mean varchar, result_vol varchar, result_pervol varchar,\
cloud_x varchar, cloud_y varchar, cloud_z varchar, datetime varchar)";
解决:
使用关键字AUTOINCREMENT必须满足:
1、只能用于整型(INTEGER)字段,INT类型不可行;
2、只能用于PRIMARY KEY字段。
正确写法:
QString sql_result = "create table result(result_id INTEGER PRIMARY KEY AUTOINCREMENT, result_silo_id int,\
result_max varchar,result_min varchar, result_mean varchar, result_vol varchar, result_pervol varchar,\
cloud_x varchar, cloud_y varchar, cloud_z varchar, datetime varchar)";
错误2:
QSqlQuery::value: not positioned on a valid record
错误代码:
QString sql_select = QString("select pro_id from project_conf where pro_name = '" + pro_name + "'");
qDebug() << sql_select;
if (sql_qurey.exec(sql_select))
{
quint16 data = sql_qurey.value(0).toInt();
qDebug() << data;
}
解决:
QSqlQuery返回的数据集,record是停在第一条记录之前。因此,获得数据集后,必须执行next()或first()到第一条记录,这时record才有效。
正确写法:
QString sql_select = QString("select pro_id from project_conf where pro_name = '" + pro_name + "'");
qDebug() << sql_select;
if (sql_qurey.exec(sql_select))
{
//或者采用 if(sql_query.next())
if (sql_qurey.first())
{
quint16 data = sql_qurey.value(0).toInt();
//或者通过下面的写法
quint16 data = sql_qurey.value(""site_id"").toInt();
qDebug() << data;
}
}