Sqlite での Qt のアプリケーションについての話

1. Sqlite の概要

        SQLite は軽量のデータベースであり、ACIDに準拠したリレーショナル データベース管理システムであり、比較的小規模なデータベースです。その設計方向は組み込みであり、多くの組み込み製品に適用されており、占有リソースは非常に少なく、組み込みデバイスでは数百 kb のメモリを占有する場合もあります。同時に、Windows/Linux/Unix などの主流のオペレーティング システムをサポートし、 C ++、C#、PHP、Java などの多くのプログラミング言語と組み合わせることができ、ODBC インターフェイスを備えています。処理速度に関しては、それらすべてよりも高速です。

2 番目に、Qt のアプリケーション

1. SQL モジュールを Qt プロジェクトに導入します

   Qt += sql をプロジェクト pro ファイルに追加します

2. ヘッダーファイルを追加します

#include <QSqlDatabase> 
#include <QSqlQuery> 
#include <QSqlError> 
#include <QDebug> 
#include <QList>

3. データベースを開いて閉じる

1) データベースを開く

QSqlDatabase db;QList<QString> g_tbNameList;
QStringList g_recordList;

bool openDB()
{     db = QSqlDatabase::addDatabase("QSQLITE");     db.setDatabaseName("client.db");     bool ok = m_db.open();     返送OK; }


    


2) データベースを閉じる

void closeDB()
{     if(db.isOpen())         db.close(); }


4. データベースに存在するテーブルとテーブル名の数を確認します。

bool checkDBTableName()
{     bool bSuccess = false;     if(openDB())     {         QStringList tableList = m_db.tables();         //表数         int tbCount = tableList.count();         QString sテーブル名;         foreach (sTableName, tableList)          {             g_tbNameList.append(sTableName);         }         if(g_tbNameList.size() > 0)         {             bSuccess = true;         }     }     closeDB();     b成功を返します。}

















    

5. データベーステーブルのフィールド名を確認します。

void checkDBRecord(QString sDBTableName)
{     if(openDB())     {         QSqlQuery クエリ;         QString sql = QString("select * from %1").arg(sDBTableName);         if(!query.exec(sql))         {             qDebug()<<query.lastError().databaseText();         }







        if(query.numRowsAffected() != 0)
        {             while(query.next())             {                 for(int i = 0; i<query.record().count(); i++)                 {                     g_recordList<<query.record( ).フィールド名(i);                 }         }             }







    closeDB
    ();
}

6. データテーブルにレコードがあるかどうかを確認します

bool checkDBTableSpecificName(QString sDBTableName)
{     bool bSuccess = false;     if(openDB())     {         QSqlQuery クエリ;         QString sql = QString("select count(*) from sqlite_master where type='table' and name='%1';").arg(sDBTableName);         if(!query.exec(sql))         {             qDebug()<<query.lastError().databaseText();         }








        if(query.numRowsAffected() != 0)
        {
            if(query.next())
            {
                 if(query.value(0).toInt()==0)
                {
                    // 表不存在
                    bSuccess = true;
                }else{
                    //表存在
                    bSuccess = false;
                }
            }
        }
    }
    closeDB();
    return bSuccess;
}

7. テーブルデータを抽出するための Qt スキーム

bool selectDBTableData(QString sDBTableName)
{     bool bSuccess = false;     if(openDB())     {         QSqlQuery クエリ;         QString sql = QString("select * from %1").arg(sDBTableName);         if(!query.exec(sql))         {             qDebug()<<query.lastError().text();         }








        if(query.numRowsAffected() != 0)
        {             while(query.next())             {                 //方案一:                 QString sName = query.value(0).toString();                 int num = query.value(1).toInt();                 double dMoneyNum = query.value(2).toDouble();                 bool bRun = query.value(3).toBool();                 //案二:                 QString sName = query.value("ID").toString();                 int num = query.value("Num").toInt();                 double dMoneyNum = query.value("MoneyNum").toDouble();                 bool bRun = query.value("Run").toBool();







                





                //案三:
                QString sName = query.record().value(0).toString();
                int num = query.record().value(1).toInt();
                double dMoneyNum = query.record().value(2).toDouble();
                bool bRun = query.record().value(3).toBool();
                //方式四:
                QString sName = query.record().value("ID").toString();
                int num = query.record().value("Num").toInt();
                double dMoneyNum = query.record().value("MoneyNum").toDouble();
                bool bRun = query.record().value("Run").toBool();
            }
        }

    closeDB
    ();
    b成功を返します。
}

8. データテーブル挿入データ

bool insertDBTableAllRecord(QString sDBTableName, QString sName, int num, double dMoneyNum, bool bRun)
{     bool bSuccess = false;     if(openDB())     {         //案一:         QSqlQuery クエリ;         QString sql = QString("'%1' (Name, num, MoneyNum, Run) 値 ('%2', %3, %4, %5)").arg(sDBTableName).arg(sName) に挿入します。 arg(num).arg(dMoneyNum).arg(bRun);         if(!query.exec(sql))         {             qDebug()<<query.lastError().text();         }         else         {             bSuccess = true;         }         //方案二:















        QString sql = QString("'%1' (Name, num, MoneyNum, Run) 値 (:Name, :num, :MoneyNum, :Run) に挿入").arg(sDBTableName);
        QSqlQueryクエリ;
        クエリ.準備(SQL);
        query.bindValue(":名前", "トム");
        query.bindValue(":Num", 25);
        query.bindValue(":MoneyNum", 160.8995);
        query.bindValue(":実行", 1);
        if(!query.exec(sql))
        {             qDebug()<<query.lastError().text();         }         else         {             bSuccess = true;         }         //方案三:







        QString sql = QString("'%1' (Name, num, MoneyNum, Run) 値 (:ID, :Num, :MoneyNum, :Run) に挿入").arg(sDBTableName);
        QSqlQueryクエリ;
        クエリ.準備(SQL);
        query.bindValue(0, "トム");
        query.bindValue(1, 25);
        query.bindValue(2, 160.8995);
        query.bindValue(3, 1);
        if(!query.exec(sql))
        {             qDebug()<<query.lastError().text();         }         else         {             bSuccess = true;         }         //方案四:         QString sql = QString("'%1' (Name, num, MoneyNum, Run) の値 (?, ?, ?, ?) に挿入します。")。








        QSqlQueryクエリ;
        クエリ.準備(SQL);
        query.addBindValue("トム");
        query.addBindValue(25);
        query.addBindValue(160.8995);
        query.addBindValue(1);
        if(!query.exec(sql))
        {             qDebug()<<query.lastError().text();         }         else         {             bSuccess = true;         }





    closeDB
    ();
    b成功を返します。
}

9. テーブル内の指定したレコードを削除します

bool deleteDBTableAllRecord(QString sName)
{     bool bSuccess = false;     if(openDB())     {         QSqlQuery クエリ;         QString sql = QString("name = '%2' の %1 から * を削除").arg(sDBTableName).arg(sName);         if(!query.exec(sql))         {             qDebug()<<query.lastError().text();         }         else         {             bSuccess = true;         }     }     closeDB();     b成功を返します。}
















10. テーブルのレコードを更新する

bool updateDBTableRecord(QString sName)
{     bool bSuccess = false;     if(openDB())     {         QSqlQuery クエリ;         QString sql = QString("update %1 set Name = '%2'").arg(sDBTableName).arg(sName);         if(!query.exec(sql))         {             qDebug()<<query.lastError().text();         }         else         {             bSuccess = true;         }     }     closeDB();     b成功を返します。}
















11. Qtデータベースsqliteのトランザクションについて

SQLite は
トランザクションを開始します: "begin;";
ロールバック: "rollback;";
トランザクションをコミットします: "commit;"。

QSqlDatabase は、対応するトランザクション、ロールバック、およびコミットの 3 つの機能を提供し、対応する操作を実行します。

1) トランザクションがサポートされているかどうかを検出します。

qDebug() <<"DB hasFeature:Transaction:" <<db.driver()->hasFeature(QSqlDriver::Transactions);

2) 例 1:

bool updateDBTableRecord(QString sName)
{     bool bSuccess = false;     if(openDB())     {         QSqlQuery クエリ;         QString sql = QString("update %1 set Name = '%2'").arg(sDBTableName).arg(sName);         if(!query.exec(sql))         {             qDebug()<<query.lastError().text();             query.exec("ROLLBACK");//提交         }         else         {             bSuccess = true;             query.exec("COMMIT");//提交         }     }     closeDB();     b成功を返します。}


















例 2:

bool insertDBTableAllRecord(QString sDBTableName, QString sName, int num, double dMoneyNum, bool bRun)
{     bool bSuccess = false;     db.transaction();     if(openDB())     {         QSqlQuery クエリ;         QString sql = QString("'%1' (Name, num, MoneyNum, Run) 値 ('%2', %3, %4, %5)").arg(sDBTableName).arg(sName) に挿入します。 arg(num).arg(dMoneyNum).arg(bRun);         if(!query.exec(sql))         {             qDebug()<<query.lastError().text();         }         else         {             bSuccess = true;         m_db     。     _ 専念();     closeDB();     b成功を返します。


















説明
: トランザクションを使用すると、データベースの読み取りおよび書き込みの効率が向上し、次にデータのセキュリティが確保されます。原子性 (Aomicity)、一貫性 (Consistency)、分離 (Isolation)、永続性 (Durability) の特性があります。

おすすめ

転載: blog.csdn.net/leiyang2014/article/details/125821128