SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它是一种相对较小的数据库。它的设计方向面向是嵌入式的,而且已经在很多嵌入式产品中应用了它,其占用资源非常的低,在嵌入式设备中,可能占用百kb内存。同时支持Windows/Linux/Unix等等主流的操作系统,能够跟很多程序语言相结合,比如 C++、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、等开源的世界著名数据库管理系统来讲,其处理速度比它们都快。
1.Qt项目中引入sql模块
在工程pro文件中添加Qt += sql
2.加入头文件
#include#include #include #include #include
3.数据库的开启与关闭
1)数据库的开启
QSqlDatabase db;QList
QStringList g_recordList;
bool openDB()
{
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("client.db");
bool ok = m_db.open();
retun 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 sTableName;
foreach (sTableName, tableList)
{
g_tbNameList.append(sTableName);
}
if(g_tbNameList.size() > 0)
{
bSuccess = true;
}
}
closeDB();
return bSuccess;
}
5.检查数据库表中字段名
void checkDBRecord(QString sDBTableName)
{
if(openDB())
{
QSqlQuery query;
QString sql = QString("select * from %1").arg(sDBTableName);
if(!query.exec(sql))
{
qDebug()<
if(query.numRowsAffected() != 0)
{
while(query.next())
{
for(int i = 0; i
g_recordList<
}
}
}
closeDB();
}
6.检查数据表是否有记录
bool checkDBTableSpecificName(QString sDBTableName)
{
bool bSuccess = false;
if(openDB())
{
QSqlQuery query;
QString sql = QString("select count(*) from sqlite_master where type='table' and name='%1';").arg(sDBTableName);
if(!query.exec(sql))
{
qDebug()<
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 query;
QString sql = QString("select * from %1").arg(sDBTableName);
if(!query.exec(sql))
{
qDebug()<
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();
return bSuccess;
}
8.数据表插入数据
bool insertDBTableAllRecord(QString sDBTableName, QString sName, int num, double dMoneyNum, bool bRun)
{
bool bSuccess = false;
if(openDB())
{
//方案一:
QSqlQuery query;
QString sql = QString("insert into '%1' (Name, num, MoneyNum, Run) values('%2', %3, %4, %5)").arg(sDBTableName).arg(sName).arg(num).arg(dMoneyNum).arg(bRun);
if(!query.exec(sql))
{
qDebug()<
else
{
bSuccess = true;
}
//方案二:
QString sql = QString("insert into '%1' (Name, num, MoneyNum, Run) values (:Name, :num, :MoneyNum, :Run)").arg(sDBTableName);
QSqlQuery query;
query.prepare(sql);
query.bindValue(":Name", "Tom");
query.bindValue(":Num", 25);
query.bindValue(":MoneyNum", 160.8995);
query.bindValue(":Run", 1);
if(!query.exec(sql))
{
qDebug()<
else
{
bSuccess = true;
}
//方案三:
QString sql = QString("insert into '%1' (Name, num, MoneyNum, Run) values (:ID, :Num, :MoneyNum, :Run)").arg(sDBTableName);
QSqlQuery query;
query.prepare(sql);
query.bindValue(0, "Tom");
query.bindValue(1, 25);
query.bindValue(2, 160.8995);
query.bindValue(3, 1);
if(!query.exec(sql))
{
qDebug()<
else
{
bSuccess = true;
}
//方案四:
QString sql = QString("insert into '%1' (Name, num, MoneyNum, Run) values (?, ?, ?, ?)").arg(sDBTableName);
QSqlQuery query;
query.prepare(sql);
query.addBindValue("Tom");
query.addBindValue(25);
query.addBindValue(160.8995);
query.addBindValue(1);
if(!query.exec(sql))
{
qDebug()<
else
{
bSuccess = true;
}
}
closeDB();
return bSuccess;
}
9.删除表指定记录
bool deleteDBTableAllRecord(QString sName)
{
bool bSuccess = false;
if(openDB())
{
QSqlQuery query;
QString sql = QString("delete * from %1 where Name = '%2'").arg(sDBTableName).arg(sName);
if(!query.exec(sql))
{
qDebug()<
else
{
bSuccess = true;
}
}
closeDB();
return bSuccess;
}
10.更新表记录
bool updateDBTableRecord(QString sName)
{
bool bSuccess = false;
if(openDB())
{
QSqlQuery query;
QString sql = QString("update %1 set Name = '%2'").arg(sDBTableName).arg(sName);
if(!query.exec(sql))
{
qDebug()<
else
{
bSuccess = true;
}
}
closeDB();
return bSuccess;
}
11.关于Qt数据库sqlite中的事务
SQLite
开启事务:"begin;";
进行回滚:"rollback;";
提交事务:"commit;"。
QSqlDatabase提供了对应的transaction、rollback、commit三个函数来执行对应操作。
1)检测是否支持事务:
qDebug() <<"DB hasFeature:Transaction:" <
2)示例1:
bool updateDBTableRecord(QString sName)
{
bool bSuccess = false;
if(openDB())
{
QSqlQuery query;
QString sql = QString("update %1 set Name = '%2'").arg(sDBTableName).arg(sName);
if(!query.exec(sql))
{
qDebug()<
}
else
{
bSuccess = true;
query.exec("COMMIT");//提交
}
}
closeDB();
return bSuccess;
}
示例2:
bool insertDBTableAllRecord(QString sDBTableName, QString sName, int num, double dMoneyNum, bool bRun)
{
bool bSuccess = false;
db.transaction();
if(openDB())
{
QSqlQuery query;
QString sql = QString("insert into '%1' (Name, num, MoneyNum, Run) values('%2', %3, %4, %5)").arg(sDBTableName).arg(sName).arg(num).arg(dMoneyNum).arg(bRun);
if(!query.exec(sql))
{
qDebug()<
else
{
bSuccess = true;
}
}
m_db.commit();
closeDB();
return bSuccess;
}
说明:使用事务可以提高数据库的读写效率,其次保证数据的安全性。其具有原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )等特点。