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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章