Qt SQLite简单用法

序言

感觉自己老是会忘记需要百度,干脆直接记下来

环境

Qt5.14.2 + MSVC2017(VS2019)

使用前准备

Qt Creator:

QT	+= sql

VS:

属性页-》Qt Project Settings-》Qt Modules-》Sql

.

SQLite数据类型

SQLite与其他数据库不同,其他数据库是静态数据类型,即创建时便确定以后插入的数据类型;

而SQLite是动态数据类型,即即使表格声明了类型,其插入不同的数据类型依然不受影响,只是会优先参考建表时的类型。

因此尽量插入按表格创建类型来插入,可以减少对转换时的性能开销。

SQLite中数据的类型按存储类型声明列名。

其存储类型包括:

存储类型描述
NULL空值。
INTEGER有符号整数类型,值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8.
REAL所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.
TEXT值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).
BLOB值是BLOB数据,如何输入就如何存储,不改变格式.

而亲和类型包括以下几种:

Affinity描述
TEXT数值型数据在被插入之前,需要先被转换为文本格式,之后再插入到目标字段中。
NUMBERIC当文本数据被插入到亲缘性为NUMERIC的字段中时,如果转换操作不会导致数据信息丢失以及完全可逆,那么SQLite就会将该文本数据转换为INTEGER或REAL类型的数据,如果转换失败,SQLite仍会以TEXT方式存储该数据。对于NULL或BLOB类型的新数据,SQLite将不做任何转换,直接以NULL或BLOB的方式存储该数据。需要额外说明的是,对于浮点格式的常量文本,如"30000.0",如果该值可以转换为INTEGER同时又不会丢失数值信息,那么SQLite就会将其转换为INTEGER的存储方式。
INTEGER对于亲缘类型为INTEGER的字段,其规则等同于NUMERIC,唯一差别是在执行CAST表达式时。
REAL其规则基本等同于NUMERIC,唯一的差别是不会将"30000.0"这样的文本数据转换为INTEGER存储方式。
NONE不做任何的转换,直接以该数据所属的数据类型进行存储。

.

加载SQLite

Qt自带的SQLite无账号密码可言,所以无需写

QString connectionName = QLatin1String("database");								//连接名
QSqlDatabase db;

if (QSqlDatabase::contains(connectionName))										//看是否已经连接过,有则直接连接该连接
	db = QSqlDatabase::database(connectionName);	
else {
	db = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"), connectionName);	//加载数据库
	db.setDatabaseName(QStringLiteral("./mosrun.db"));							//没有该文件就会自动创建
	if (!db.open()) {
		qWarning() << __FILE__ << __LINE__ << QStringLiteral("Error:") << db.lastError();		//若连接失败则打印原因
		return;
	}
}

QSqlQuery query(db);															//语句使用类

db.close();

.

SQL命令

事务

方法1:

db.transaction();
... 命令 ...
for
	query.exec("命令");
... 命令 ...
db.commit();		//提交
db.rollback();		//回滚

方法2:

query.exec(QStringLiteral("BEGIN TRANSACTION;"));
... 命令 ...
for
	query.exec("命令");
... 命令 ...
query.exec(QStringLiteral("COMMIT"));//提交
query.exec(QStringLiteral("ROLLBACK"));//回滚

.

数据库表名

一般来说,我们查询的时候只需要输入show tables;,就可以获取表格名,但是QSqlQuery只能获取表里数据,所以只需要通过db.tables();就能打印出表格名

.

命令

以下方法来源于Qt帮助文档以及自己少许修改

方法1

QSqlQuery query("SELECT country FROM artist");
while (query.next()) 
{
	QString country = query.value(0).toString();
	doSomething(country);
}

QSqlQuery query("SELECT * FROM artist");
int fieldNo = query.record().indexOf("country");
while (query.next()) 
{
    QString country = query.value(fieldNo).toString();
    doSomething(country);
}

方法2

QSqlQuery query("SELECT * FROM artist");
while (query.next()) 
{
    QString country = query.value("country").toString();
    doSomething(country);
}

方法3

QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
              "VALUES (:id, :forename, :surname)");
query.bindValue(":id", 1001);
query.bindValue(":forename", "Bart");
query.bindValue(":surname", "Simpson");
query.exec();

方法4

QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
              "VALUES (:id, :forename, :surname)");
query.bindValue(0, 1001);
query.bindValue(1, "Bart");
query.bindValue(2, "Simpson");
query.exec();

方法5

QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
              "VALUES (?, ?, ?)");
query.bindValue(0, 1001);
query.bindValue(1, "Bart");
query.bindValue(2, "Simpson");
query.exec();

方法6

QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
			  "VALUES (?, ?, ?)");
query.addBindValue(1001);
query.addBindValue("Bart");
query.addBindValue("Simpson");
query.exec();

方法7

QSqlQuery query;
query.prepare("CALL AsciiToInt(?, ?)");
query.bindValue(0, "A");
query.bindValue(1, 0, QSql::Out);
query.exec();
int i = query.boundValue(1).toInt(); // i is 65

未完待续…

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

溪渣渣_梁世华

打赏?我甚至没有任何收费的章节

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值