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) の特性があります。