Qt 5操作数据库

本文详细介绍使用 Qt 进行 SQL 数据库操作的方法,包括连接数据库、创建表、插入、查询、更新、删除数据及事务处理等核心操作。通过示例代码展示了不同数据库驱动(如 QOCI 和 QSQLITE)的配置与使用,以及如何利用 prepare 函数和占位符避免 SQL 注入风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多时候要用到, 方便以后到处找

QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");  
db.setHostName("localhost");    //数据库主机名   
db.setDatabaseName("scott");    //数据库名   
db.setUserName("stott");        //数据库用户名   
db.setPassword("tiger");        //数据库密码   
db.open();          //打开数据库连接  
db.close();         //释放数据库连接  
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  
db.setDatabaseName("database.db");  
if (!db.open())   
{  
    qDebug("数据库不能打开");  
}  
建立数据库文件后创建表并插入两条数据  
QSqlQuery query;  
query.exec("create table student(id INTEGER PRIMARY KEY autoincrement,  
            name nvarchar(20), age int)"); //id自动增加  
query.exec("insert into student values(1,'name_1', 14)");  
query.exec("insert into student values(2,'name2',15)"); 


适合插入多条记录,或者避免将值转换成字符串(即正确地转义),调用prepare()函数指定一个包含占位符的query,然后绑定要插入的值
ORACLE语法
QSqlQuery query;   
query.prepare("INSERT INTO T_STUDENT (name, age) VALUES (:name, :age)"); //准备执行SQL查询  
query.bindValue(":name", "name_1");   //在绑定要插入的值  
query.bindValue(":age", 14);   
query.exec(); 

ODBC语法
QSqlQuery query;  
query.prepare("INSERT INTO T_STUDENT (name,age) VALUES (?,?)"); //准备执行SQL查询  
query.addBindValue("name_1");   //在绑定要插入的值  
query.bindValue(14);  
query.exec();  


批量插入到数据库中
QSqlQuery query;  
query.prepare(“insert into student values (?, ?)”);  
QVariantList names;  
names << "小王" << "小明" << "小张" << "小新"; // 如果要提交空串,QVariant(QVariant::String)代替名字  
query.addBindValue(names);  
QVariantList ages;  
ages << 11 << 13 << 12 << 11;  
query.addBindValue(ages);  
if (!q.execBatch()) //进行批处理,如果出错就输出错误  
    qDebug() << q.lastError();  
查询数据库操作
QSqlQuery query;  
query.exec("SELECT * FROM t_STUDENT"); // 查询的结果可能不止一条记录,所以我们称之为结果集  
while (query.next())  
{  
    QString name = query.value(0).toString(); //取第i条记录第1个字段(从0开始计数)的结果  
    int age = query.value(0).toInt(); //取第i条记录第2个字段的结果  
    // ... 处理name,age变量数据   
} 

seek(int n) :query指向结果集的第n条记录。指定当前的位置
first() :query指向结果集的第一条记录。
last() :query指向结果集的最后一条记录。
next() :query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录。
previous() :query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录。
record() :获得现在指向的记录。
value(int n) :获得属性的值。其中n表示你查询的第n个属性
int rowNum = query.at(); //获取query所指向的记录在结果集中的编号
int fieldNo = query.record().indexOf(“name”); //返回"name"的列号
int columnNum = query.record().count(); //获取每条记录中属性(即列)的个数

删除
DELETE FROM 表名称 WHERE 列名称 = 值
更新
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
事务操作
操作函数:transaction(),commit()提交,rollback()回滚
操作事务前,先判断该数据库是否支持事务操作。hasFeature是QSQLDriver类函数
if (QSqlDatabase::database().driver()->hasFeature(QSqlDriver::Transactions)){ ... } // 插入一条记录,然后提交事务
QSqlDatabase::database().transaction();  
QSqlQuery query;  
query.exec("SELECT id FROM T_STUDENT WHERE class=1");  
if (query.next())  
{  
    query.exec("INSERT INTO T_STUDENT (id,name,age) VALUES (3,'小李',13)");  
}  
QSqlDatabase::database().commit(); 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值