您的位置:首页 > 编程语言 > Qt开发

QT笔记:数据库总结(一)

2016-09-08 14:36 381 查看
#include 

QT += sql

QSqlDatabase类实现了数据库连接的操作

QSqlQuery类执行SQL语句

QSqlRecord类封装数据库所有记录

QSqlDatabase类

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("数据库不能打开");  

}  

return false;  

建立数据库文件后创建表并插入两条数据  

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,'小明', 14)");  

query.exec("insert into student values(2,'小王',15)");  

QSqlQuery类

插入值到数据库操作

一、直接用SQL语句插入(参照上面)

二、利用预处理方式插入(ORACLE语法和ODBC语法)

适合插入多条记录,或者避免将值转换成字符串(即正确地转义),调用prepare()函数指定一个包含占位符的query,然后绑定要插入的值

ORACLE语法

QSqlQuery query;   

query.prepare("INSERT INTO T_STUDENT (name, age) VALUES (:name, :age)"); //准备执行SQL查询  

query.bindValue(":name", "小王");   //在绑定要插入的值  

query.bindValue(":age", 11);   

query.exec();  

ODBC语法

QSqlQuery query;  

query.prepare("INSERT INTO T_STUDENT (name,age) VALUES (?,?)"); //准备执行SQL查询  

query.addBindValue("小王");   //在绑定要插入的值  

query.bindValue(11);  

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(); //获取每条记录中属性(即列)的个数

 

事务操作

操作函数: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();  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: