sql语句学习链接:https://www.w3school.com.cn/sql/sql_syntax.asp
qt使用sqlite教程
0、准备
pro文件添加sql模块。
添加对应头文件:
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
1、 QSqlQuery与QSqlDatabase如何关联
当您使用addDatabase创建QSqlDatabase对象时,或者当您调用removeDatabase时,您只是将一个元组(驱动程序,主机名:端口,数据库名称,用户名/密码)关联或取消关联到名称(或默认连接名称,
t指定连接名称)。 SQL驱动程序被实例化,但数据库只有在您调用QSqlDatabase :: open时才会打开。
有兴趣的转细解链接:https://blog.csdn.net/weixin_39732027/article/details/111740896
或者:http://www.voidcn.com/article/p-tpwkcpdx-bsu.html
(1)如果QSqlQuery使用的全局或类成员:
database = QSqlDatabase::addDatabase(db_type); //设置数据库类型
database.setDatabaseName(db_name);
if (!database.open())
{
qDebug()<<Q_FUNC_INFO<<"Error: Failed to connect database!" << database.lastError();
return 0;
}
sql_query = new QSqlQuery(database); //QSqlDatabase与QSqlQuery关联
(2)如果QSqlQuery为局部变量,也要在创建时关联数据库:
bool ok ;
QSqlQuery query(database); //QSqlDatabase与QSqlQuery关联
ok = query.exec("delete from PerformanceTestData where "+ filter);
return ok;
后文QSqlQuery使用的类成员,为前者。
2、建立并打开数据库:
打开myDataBase.db
,如果数据库不存在则会创建数据库,设置数据库类型为QSQLITE
。
QSqlDatabase database;
database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName("myDataBase.db");
if (!database.open())
qDebug() << "Error: Failed to connect database!" << database.lastError();
else
qDebug() << "Succeed to connect database!" ;
如果使用sqlite数据库不想产生数据库文件,可以创建内存数据库。
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
关闭数据库
database.close();
3、创建表格TableUserAccount
使用语句CREATE TABLE IF NOT EXISTS TableUserAccount
,如果表格不存在才会创建表格。
QString strUserAccount = QString("CREATE TABLE IF NOT EXISTS TableUserAccount(\
ID integer primary key autoincrement, \
UserName TEXT, \
Password TEXT, \
iLevel integer, \
strLevel TEXT, \
Department TEXT, \
DateTime TEXT )");
if(!sql_query.exec(strUserAccount ))
qDebug() << "Error: Fail to create table."<< sql_query.lastError();
else
qDebug() << "Table created!";
4、插入数据
语法:INSERT INTO 表名称 VALUES (值1, 值2,…)
QString strSQL = "INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')";
if(!sql_query.exec(strSQL ))
qDebug() << sql_query.lastError();
else
qDebug() << "inserted Wang!";
5、修改数据
语法:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
QString strSQL = "UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson' ";
if(!sql_query.exec(strSQL ))
qDebug() << sql_query.lastError();
else
qDebug() << "updated!";
6、删除数据
语法:DELETE FROM 表名称 WHERE 列名称 = 值
删除表中的某行,下面代码为删除 ‘id’ 列为1的行。
QString strSQL = "delete from student where id = 1";
if(!sql_query.exec(strSQL))
qDebug()<<sql_query.lastError();
else
qDebug()<<"deleted!";
可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的。sql语句如下:
QString strSQL = "delete from table_name";
7、 删除表格
sql_query.exec("drop table student");
if(sql_query.exec())
qDebug() << sql_query.lastError();
else
qDebug() << "table cleared";
8、查询数据
sql_query.exec("select * from student");
if(!sql_query.exec())
qDebug()<<sql_query.lastError();
else
{
while(sql_query.next())
{
int id = sql_query.value(0).toInt();
QString name = sql_query.value(1).toString();
int age = sql_query.value(2).toInt();
qDebug()<<QString("id:%1 name:%2 age:%3").arg(id).arg(name).arg(age);
}
}
9、获取数据库中表名
QStringList tables = database.tables();
10、获取数据库中表的所有字段信息
SQLite 的 PRAGMA 命令是一个特殊的命令,可以用在 SQLite 环境内控制各种环境变量和状态标志。
PRAGMA 命令细解:https://www.runoob.com/sqlite/sqlite-pragma.html
封装为如下查询函数(函数只获取了字段名,注释有说明获取字段序号、类型):
QStringList BaseDB::getTableInfo(QString tabNmae)
{
QStringList indexList;
QString str = "PRAGMA table_info(" + tabNmae + ")";
sql_query->prepare(str);
if (sql_query->exec())
{
//sql_query->value(0):indexNum
//sql_query->value(1):indexName
//sql_query->value(2):indexType
while (sql_query->next())
indexList<<sql_query->value(1).toString();
}
else
qDebug() << sql_query->lastError();
return indexList;
}