LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭
QT笔记:数据库总结(一)
2017-02-13

#include <QtSql>

  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()回滚


if (QSqlDatabase::database().driver()->hasFeature(QSqlDriver::Transactions)){ ... } //


  操作事务前,先判断该数据库是否支持事务操作。hasFeature是QSQLDriver类函数

  插入一条记录,然后提交事务


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();





推荐文章
评论(0)
联系我们|招贤纳士|移动客户端|风格模板|官方博客|侵权投诉 Reporting Infringements|未成年人有害信息举报 0571-89852053|涉企举报专区
网易公司版权所有 ©1997-2024  浙公网安备 33010802010186号 浙ICP备16011220号-11 增值电信业务经营许可证:浙B2-20160599
网络文化经营许可证: 浙网文[2022]1208-054号 自营经营者信息 工业和信息化部备案管理系统网站 12318全国文化市场举报网站
网信算备330108093980202220015号 网信算备330108093980204230011号
分享到
转载我的主页