Qt之SQL数据库
2015-12-02 17:35
781 查看
----------------------------
http://blog.csdn.net/reborntercel/article/details/6991147
http://blog.csdn.net/fzu_dianzi/article/details/6959268
--------------------------------
需要说明,当刚执行完query.exec(“select * from student”);这行代码时,query是指向结果集以外的,我们可以利用query.next(),当第一次执行这句代码时,query便指向了结果集的第一条记录。当然我们也可以利用seek(0)函数或者first()函数使query指向结果集的第一条记录。但是为了节省内存开销,推荐的方法是,在query.exec(“select * from student”);这行代码前加上query.setForwardOnly(true);这条代码,此后只能使用next()和seek()函数。
#include <QtSql>
QT += sql
QSqlDatabase类实现了数据库连接的操作
QSqlQuery类执行SQL语句
QSqlRecord类封装数据库所有记录
QSqlDatabase类
[cpp] view plaincopyprint?
QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
db.setHostName("localhost"); //数据库主机名
db.setDatabaseName("scott"); //数据库名
db.setUserName("stott"); //数据库用户名
db.setPassword("tiger"); //数据库密码
db.open(); //打开数据库连接
db.close(); //释放数据库连接
建立数据库文件
[cpp] view plaincopyprint?
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("database.db");
if (!db.open())
{
qDebug("数据库不能打开");
}
return false;
[cpp] view plaincopyprint?
建立数据库文件后创建表并插入两条数据
[cpp] view plaincopyprint?
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语法
[cpp] view plaincopyprint?
QSqlQuery query;
query.prepare("INSERT INTO T_STUDENT (name, age) VALUES (:name, :age)"); //准备执行SQL查询
query.bindValue(":name", "小王"); //在绑定要插入的值
query.bindValue(":age", 11);
query.exec();
ODBC语法
[cpp] view plaincopyprint?
QSqlQuery query;
query.prepare("INSERT INTO T_STUDENT (name,age) VALUES (?,?)"); //准备执行SQL查询
query.addBindValue("小王"); //在绑定要插入的值
query.bindValue(11);
query.exec();
三、批量插入到数据库中
[cpp] view plaincopyprint?
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();
查询数据库操作
[cpp] view plaincopyprint?
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类函数
[cpp] view plaincopyprint?
if (QSqlDatabase::database().driver()->hasFeature(QSqlDriver::Transactions)){ ... } //
插入一条记录,然后提交事务
[cpp] view plaincopyprint?
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();
http://blog.csdn.net/reborntercel/article/details/6991147
http://blog.csdn.net/fzu_dianzi/article/details/6959268
--------------------------------
需要说明,当刚执行完query.exec(“select * from student”);这行代码时,query是指向结果集以外的,我们可以利用query.next(),当第一次执行这句代码时,query便指向了结果集的第一条记录。当然我们也可以利用seek(0)函数或者first()函数使query指向结果集的第一条记录。但是为了节省内存开销,推荐的方法是,在query.exec(“select * from student”);这行代码前加上query.setForwardOnly(true);这条代码,此后只能使用next()和seek()函数。
#include <QtSql>
QT += sql
QSqlDatabase类实现了数据库连接的操作
QSqlQuery类执行SQL语句
QSqlRecord类封装数据库所有记录
QSqlDatabase类
[cpp] view plaincopyprint?
QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
db.setHostName("localhost"); //数据库主机名
db.setDatabaseName("scott"); //数据库名
db.setUserName("stott"); //数据库用户名
db.setPassword("tiger"); //数据库密码
db.open(); //打开数据库连接
db.close(); //释放数据库连接
建立数据库文件
[cpp] view plaincopyprint?
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("database.db");
if (!db.open())
{
qDebug("数据库不能打开");
}
return false;
[cpp] view plaincopyprint?
建立数据库文件后创建表并插入两条数据
[cpp] view plaincopyprint?
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语法
[cpp] view plaincopyprint?
QSqlQuery query;
query.prepare("INSERT INTO T_STUDENT (name, age) VALUES (:name, :age)"); //准备执行SQL查询
query.bindValue(":name", "小王"); //在绑定要插入的值
query.bindValue(":age", 11);
query.exec();
ODBC语法
[cpp] view plaincopyprint?
QSqlQuery query;
query.prepare("INSERT INTO T_STUDENT (name,age) VALUES (?,?)"); //准备执行SQL查询
query.addBindValue("小王"); //在绑定要插入的值
query.bindValue(11);
query.exec();
三、批量插入到数据库中
[cpp] view plaincopyprint?
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();
查询数据库操作
[cpp] view plaincopyprint?
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类函数
[cpp] view plaincopyprint?
if (QSqlDatabase::database().driver()->hasFeature(QSqlDriver::Transactions)){ ... } //
插入一条记录,然后提交事务
[cpp] view plaincopyprint?
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();
相关文章推荐
- QTP 继续使用
- qt中使用mysql报没有mysql驱动错误的解决方案
- ubuntu下Qt Creator使用遇到的错误汇总(持续更新)
- QT中的QRegExp学习(正则表达式)
- VS+QT实现语言自动切换
- Qt打包生成exe
- QT Rectanle 类型解析
- ubuntu搭建pyqt5开发环境
- 【QT学习】对话类QDialog
- QtE4.6.3触摸屏隐藏鼠标指针的方法总结
- QT Qdesktopwidget
- win7下,vs2013+qt5.3+qwt6.1.2安装配置
- PyQt4在spyder中使用,程序只能运行一次,第二次运行报错:It seems the kernel died unexpectedly. Use 'Restart kernel' to cont
- vs2008静态编译Qt4.8.6
- QT WINDOWS下发布
- QTableView 二次整理
- Qt使用教程之添加Qt版本
- Qt—遍历文件夹以及过滤文件
- Qt Creator介绍
- Qt Creator介绍