Qt 的QtSql模块介绍

SQL基础介绍:

 

1

.pro文件中添加:QT += sql支持数据库操作

2、查询优化当前系统支持中数据库驱动有哪些?

代码如下:

#include <QCoreApplication>

#include <QSqlDatabase>

#include <QDebug>

#include <QStringList>

int main(int argc, char *argv[])

{

    QCoreApplication a(argc, argv);

    qDebug() << "Available drivers:";

    //获取驱动列表

    QStringList drivers = QSqlDatabase::drivers();

    //遍历输出

    foreach(QString driver, drivers)

    qDebug() << driver;

    return a.exec();

}

3、数据库的创建连接:使用到QSqlDatabase和QSqlQuery 类

QSqlDatabase:

代表一个数据库连接,该类提供了访问数据库的接口,而该类的实例代表着一个数据库的连接 而这个连接通过支持的数据库驱动程序进行访问,或者, 你可以从QSqlDriver子类化数据库驱动程序。 我们可以通过QSqlDatabase的讲台成员函数addDatabase()来创建一个连接,调用这个函数时,我们可以传递我们要访问哪种类型的数据库。

QSqlQuery类提供了一种执行和操纵SQL语句的方式;

QSqlQuery包括了所有的功能,像在一个QSqlDatabase上执行SQL查询创建、导航和索取数据等等。 它可以执行DML(数据操作语言)语句,比如 SELECTINSERTUPDATE 和 DELETE, 还可以执行DDL(数据定义语言)语句,比如:CREATE TABLE。 不仅如此,它还可以用于执行特定数据库而不是标准SQL语句的指令(比如 SET DATESTYLE=ISO 用于 PostgreSQL).

成功执行一SQL语句设置query为活动状态( isActive() 返回TRUE)否则查询置为非活动状态。无论那种情况,执行一条新的 SQL 语句之后,查询都被定位在一个无效的记录上;所以在数据被获取之前,查询都必须被导航到一个有效的记录上 (isValid()可以确定查询是否处在一个有效的记录上)。

在记录之间进行导航用以下一条函数:

这些函数允许程序员向前、向后或随心所欲地在查询返回的记录之间移动。一旦一个处于活动状态的查询 被定位在一个有效的记录上时,就可以通过value()获取数据。所有的数据都被用QVariants从SQL后端转换过来。

比如:

    QSqlQuery query( "select name from customer" );
    while ( query.next() ) {
        QString name = query.value(0).toString();
        doSomething( name );
    }
    

要获得从一个查询中返回的数据,用value()方法。由SELECT语句返回的数据中的每个域可以通过指定一个索引来访问,索引从0开始。没有一个方法可以通过指定名字来定位域的,因为这不能得到可能确认。(请看QSqlCursor,它提供一个更加有弹性的接口用于从一个表单中选择数据或在一个数据库中查看数据)。

GUI快速入门对QSqlQuery的介绍:

QSqlQuery类提供了一个接口,用于执行SQL语句和浏览查询的结果集。要执行一个SQL语句,只需要创建一个QSqlQuery对象,然调用QSqlQuery::exec()函数即可;


   





为了避免数据库操作时出现如下错误:

  1):由于定义多个数据库使用过程中,又再次调用QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 造成了问题。

   QSqlDatabasePrivate::addDatabase:duplicate connection name

'qt_sql_default_connection', old connection removed.

代码修改如下例子所示:

调用数据库时要指明使用的库:  代码如下  

QSqlDatabase db = QSqlDatabase::database("connection1");

 QSqlQuery query1(db);

 

  2):执行query.exec时没有指定db

QSqlQuery::exec: database not open

 

例子:

头文件:connection.h

#ifndef CONNECTION_H

#define CONNECTION_H

#include <QSqlDatabase>

#include <QDebug>

#include <QSqlQuery>

#include <QMessageBox>

#include <QSqlError>

static bool createConnection()

{

/***************(1)的解决方式***************/

   //添加数据库驱动 

    QSqlDatabase db;

    if(QSqlDatabase::contains("connection1"))

     db = QSqlDatabase::database("connection1");

    else

     db = QSqlDatabase::addDatabase("QSQLITE", "connection1");

    //设置数据库名称(数据库存放的目录以及要创建的数据库的名称)

    db.setDatabaseName("D:\\work\\test\\sqlq_name.db");

/***************(1)的解决方式***************/

//打开数据库

if(!db.open())

{

    QMessageBox::critical(0,"cannot open data","Unable to establish a database connection.",QMessageBox::Cancel);

    return false;

}

/***************(2)的解决方式***************/

/***指定db****/

//以下执行相关sql语句

QSqlQuery query(db);

/***************(2)的解决方式***************/

//新建student表,id设置为主键,还有一个name项

query.exec("create table student(id int primary key,name varchar)");

//向表中插入3条记录

query.exec("insert into student values(1,'xiaogang')");

query.exec("insert into student values(2,'xiaoming')");

query.exec("insert into student values(3,'xiaohong')");

query.exec("insert into student values(4,'xiaohao')");

//添加数据库驱动 

 QSqlDatabase db1;

 if(QSqlDatabase::contains("connection2"))

  db1 = QSqlDatabase::database("connection2");

 else

  db1 = QSqlDatabase::addDatabase("QSQLITE", "connection2");

 //设置数据库名称

 db1.setDatabaseName("D:\\hxjwork\\qttest\\017\\sqlq_name1.db");

//打开数据库

if(!db1.open())

{

    QMessageBox::critical(0,"cannot open data","Unable to establish a database connection.",QMessageBox::Cancel);

    return false;

}

//以下执行相关sql语句

QSqlQuery query1(db1);

//新建student表,id设置为主键,还有一个name项

query1.exec("create table student(id int primary key,name varchar)");

//向表中插入3条记录

query1.exec("insert into student values(1,'xiaogang1')");

query1.exec("insert into student values(2,'xiaoming1')");

query1.exec("insert into student values(3,'xiaohong1')");

query1.exec("insert into student values(4,'xiaohao1')");

    return true;

}

 

#endif // CONNECTION_H

主函数:

#include <QApplication>

#include <QSqlDatabase>

#include <QDebug>

#include <QStringList>

#include "connection.h"

void test();

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    //创建数据库连接

    if(!createConnection())

        return 1;

test();

    return a.exec();

}

4

数据库操作:SQL执行语句:QSqlQuery类

void test()   

{

#if 1

//if(!createConnection()) 

//return 1;

    QSqlDatabase db = QSqlDatabase::database("connection1");

    QSqlQuery query(db);

    query.exec("select * from student");

    while(query.next())

    {

        //query.value(0)是id的值,将其转换为int型

        int value0 = query.value(0).toInt();

        QString value1 = query.value(1).toString();

        //输出两个值

        qDebug() << value0 << value1 ;

    }

    int numRows;

    //判断数据库驱动是否支持QuerySize特性,若支持,使用size()函数获取总行数

    if(db.driver()->hasFeature(QSqlDriver::QuerySize))

    {

        qDebug()<<"has feature : query size";

        numRows = query.size();

    }

    else

    {

        qDebug()<<"no feature : query size";

        query.last();

        numRows = query.at() + 1;

    }

    qDebug()<<"row number :"<< numRows;

    //指向索引为1的记录,即第二条记录

    query.seek(1);

    //返回当前索引值

    qDebug()<<"current index:"<<query.at();

    //获取当前行记录

    QSqlRecord record = query.record();

    //获取记录中“id”和“name”两个字段的值

    int id = record.value("id").toInt();

    QString name = record.value("name").toString();

    qDebug()<<"id:"<<id<<"name:"<<name;

    //获取索引为1的字段,即第二个字段

    QSqlField field = record.field(1);

    

    //输出字段名和字段值

    qDebug()<<"second field : "<< field.name()

           <<"field value:"<< field.value().toString();

    //query.exec();

#endif

#if 1//数据插入  

//1)

    query.exec("insert into student (id,name) values(110,'chenUyurr')");

//    query.exec();

//2)

//*

    query.prepare("INSERT INTO student (id, name) "

                       "VALUES (:id,:name)");

         query.bindValue(":id", 1001);

         query.bindValue(":name", "Bart");

 //        query.exec();

//*/

//3)

//*

    query.prepare("INSERT INTO student (id, name) "

                       "VALUES (?,?)");

    QVariantList ids;

    ids<<201<<202<<203<<204;

    QVariantList names;

    names<<"qwe"<<"rty"<<"asd"<<"zxc"<<"jkl";

    query.addBindValue(ids);

    query.addBindValue(names);

    if (!query.execBatch())

         qDebug() << query.lastError();

//*/

#endif

#if 1  //update 更新数据

    QString str = QString("update student set name='%1' where id=%2").arg("qwe","204");
    query.exec(str);
    //query.exec();
#endif


#if 1 //delete 删除数据
    query.exec("delete from student where id=1001");
    //query.exec();

    query.exec();
#endif

    //现在数据库中的内容
    query.exec("select * from student");
 
 
    while(query.next())
    {
        //query.value(0)是id的值,将其转换为int型
        int value0 = query.value(0).toInt();
        QString value1 = query.value(1).toString();
        //输出两个值
        qDebug() << value0 << value1 ;
    }



}

上述代码运行结果如下:



查询数据库中的表格:

代码如下:


方式一:
QSqlDatabase db;
if(QSqlDatabase::contains("connection_Query_DP"))
 db = QSqlDatabase::database("connection_Query_DP");
else
 db = QSqlDatabase::addDatabase("QSQLITE", "connection_Query_DP");
db.setDatabaseName("D:\\hxjwork\\qttest\\017\\dbfile\\QueryData.db");


if (!db.open()) {
    QMessageBox::critical(0, "Cannot open QueryData",
        "Unable to establish a database QueryData.db", QMessageBox::Cancel);
    return ;
}
//以下执行相关sql语句
QSqlQuery query(db);

//保存数据库表
QStringList table_tmp;
QString sel_tab = QString("select name from sqlite_master WHERE type = 'table' ORDER BY name");
//QString sel_tab = QString("select name from sqlite_master WHERE type = 'table'");
qDebug()<<"sel_tab"<<"= "<<sel_tab;
int flg1 = query.exec(sel_tab);
qDebug()<<"flg = "<<flg1;
while(query.next())
{
    table_tmp<<query.value(0).toString();


}
qDebug()<<"table_tmp = "<<table_tmp;
/*
 * 
当SQLite数据库中包含自增列时,会自动建立一个名为 sqlite_sequence 的表。
这个表包含两个列:name和seq。name记录自增列所在的表,seq记录当前序号(下一条记录的编号就是当前序号加1)。
如果想把某个自增列的序号归零,只需要修改 sqlite_sequence表就可以了。
UPDATE sqlite_sequence SET seq = 0 WHERE name='TableName';
也可以直接把该记录删掉: 
DELETE FROM sqlite_sequence WHERE name='TableName';
要想将所有表的自增列都归零,直接清空sqlite_sequence表就可以了:
DELETE FROM sqlite_sequence;
 */ 
table_tmp.removeOne("sqlite_sequence");//删除SQLite数据库中包含自增列时,会自动建立一个名为 sqlite_sequence 的表


qDebug()<<"table_tmp = "<<table_tmp;



方式二:

QSqlDatabase db;
if(QSqlDatabase::contains("connection_Query_DP"))
 db = QSqlDatabase::database("connection_Query_DP");
else
 db = QSqlDatabase::addDatabase("QSQLITE", "connection_Query_DP");
db.setDatabaseName("D:\\hxjwork\\qttest\\017\\dbfile\\QueryData.db");


if (!db.open()) {
    QMessageBox::critical(0, "Cannot open QueryData",
        "Unable to establish a database QueryData.db", QMessageBox::Cancel);
    return ;
}
//获取表格
 
 
 
 
   QStringList tablelist;
   tablelist << db.tables(QSql::Tables);
   qDebug()<<tablelist;
 
 
   
//获取第一个表格中的列表名及个数
   QSqlRecord tableRec;
 
 
   tableRec = db.record(tablelist.at(0));
 
 
   int n = tableRec.count();
      qDebug()<<"tableRec.count = "<<n;
 
 
 
 

QStringList Reclist;
 
 
for(int i = 0;i<n;i++)
{
Reclist<<tableRec.fieldName(i);
 
 
}
   qDebug()<<Reclist;
 
 
 
 

结果如下:

方式一:

sel_tab = "select name from sqlite_master WHERE type = 'table' ORDER BY name"

flg = 1

table_tmp = ("Day_Data", "Hour_Data", "Liuliang_DayData", "Liuliang_HourData", "Liuliang_MinData", "Liuliang_MonthData", "Liuliang_RealtimeData", "Liuliang_TenData", "Min_Data", "Month_Data", "Realtime_Data", "Ten_Min_Data", "sqlite_sequence")

table_tmp = ("Day_Data", "Hour_Data", "Liuliang_DayData", "Liuliang_HourData", "Liuliang_MinData", "Liuliang_MonthData", "Liuliang_RealtimeData", "Liuliang_TenData", "Min_Data", "Month_Data", "Realtime_Data", "Ten_Min_Data")


方式二:


("Hour_Data", "sqlite_sequence", "Day_Data", "Month_Data", "Min_Data", "Ten_Min_Data", "Liuliang_MinData", "Realtime_Data", "Liuliang_TenData", "Liuliang_HourData", "Liuliang_DayData", "Liuliang_MonthData", "Liuliang_RealtimeData")

tableRec.count = 8

("Dip", "ip", "code", "Time", "max_Value", "min_Value", "average_Value", "total_Value")




QSqlQuery类介绍:http://www.kuqin.com/qtdocument/qsqlquery.html

QSqlDatabase类介绍:http://blog.csdn.net/u014660247/article/details/52504193#TableType-enum


猜你喜欢

转载自blog.csdn.net/qq_33557833/article/details/76619399
今日推荐