Qt提供了一种进程内数据库SQLite。它小巧灵活,无须额外安装配置且支持大部分ANSI SQL92标准,是一个轻量级的数据库,概括起来具有以下优点。
利用Qt对SQLite数据库完成数据的增、删、改、查等操作。
新建一个Qt案例,项目名称为“SQLTest”,基类选择“QWidget”,取消创建UI界面复选框的选中状态,完成项目创建。
无UI界面
在SQLTest.pro文件中添加如下代码:
QT+=sql
源文件main.cpp中代码如下:
首先需要创建SQLite数据库,然后激活与数据库的物理连接:
QSqlDatabase db =QSqlDatabase::addDatabase ("QSQLITE");//创建SQLite数据库
db.setHostName ("SQLite-001") ;//设置数据库主机名
db.setDatabaseName ("qtDB.db");//设置数据库名
db.setUserName ("Wendy") ; //设置数据库用户名
db.setPassword("123456") ; //设置数据库密码
db.open(); //打开连接
创建数据库表:
//创建数据库表
QSqlQuery query; //创建QSqlQuery对象
bool success=query.exec("create table automobil"
"(id int primary key,attribute varchar,"
"type varchar,kind varchar,nation int,"
"carnumber int,elevaltor int,"
"distance int,oil int,"
"temperature int)"); //创建数据表automobil,该表具有10个字段其中id为主键【引号内均为SQL语句】
if (success)
qDebug()<<QObject::tr("数据库表创建成功!\n");
else
qDebug()<<QObject::tr("数据库表创建失败!\n");
I.数据查询:
//I.数据查询
query.exec("select * from automobil");//查询automobil表中所有数据
QSqlRecord rec=query.record();
qDebug()<<QObject::tr("automobile表的字段数:")<< rec.count();//列数
II.数据插入:
//II.数据插入
QTime t;
t.start(); //启动一个计时器,统计操作耗时
query.prepare("insert into automobil values(?,?,?,?,?,?,?,?,?,?)");//数据插入(预先分配空间),此处使用了ODBC类型的定位占位符?
long records=100; //向表中插入任意的100条记录
for (int i=0; i<records; i++){
//绑定要插入的值
query.bindValue(0,i) ; //id int
query.bindValue(1, "四轮"); //attribute varchar
query.bindValue(2, "轿车"); //type varchar
query.bindValue(3,"富康") ; //kind varchar
query.bindValue(4,rand()%100);//nation int
query.bindValue(5,rand()%10000);//carnumber int
query.bindValue(6,rand()%300);//elevaltor int
query.bindValue(7, rand()%200000);//distance int
query.bindValue(8,rand()%52); //oil int
query.bindValue(9,rand()%100); //temperature int
success=query.exec(); //调用exec()函数在query中插入上述值
if(!success){
QSqlError lastError=query.lastError();//返回最后一个错误信息
qDebug ()<<lastError.driverText()<<QString(QObject::tr("插入失败"));
}
}
qDebug()<<QObject::tr("插入%1条记录,耗时:%2ms").arg (records).arg(t.elapsed());//插入100条数据,输出消耗的时间
t.restart() ; //重启计时器
success=query.exec("select * from automobil order by id desc") ;//按id字段的降序将查询表中刚插入的数据进行排序
if (success)
qDebug() <<QObject::tr("排序%1条记录,耗时:%2 ms").arg (records).arg(t.elapsed());//输出操作耗时
else
qDebug()<<QObject::tr("排序失败!");
III.数据修改:
//III.数据修改
t.restart();//重启计时器
for (int i=0;i<records;i++)
{
query.clear() ;
query.prepare(QString ("update automobil set attribute=?, type=?,"
"kind=?, nation=?,"
"carnumber=? ,elevaltor=?,"
"distance=?,oil=?, "
"temperature=? where id=%1").arg(i)); //SQL语句的更新操作【数据修改】(与插入操作类似)
query.bindValue(0, "四轮") ;
query.bindValue(1, "轿车") ;
query.bindValue(2, "富康") ;
query.bindValue(3, rand()%100) ;
query.bindValue(4, rand()%10000);
query.bindValue(5, rand()%300);
query.bindValue(6, rand()%200000) ;
query.bindValue(7, rand()%52) ;
query.bindValue(8, rand()%100) ;
success=query.exec(); //调用exec()函数在query中插入上述值
if (!success)
{
QSqlError lastError=query.lastError();//返回最后一个错误信息
qDebug ()<<lastError.driverText()<<QString (QObject::tr ("更新失败"));
}
}
qDebug()<<QObject::tr("更新%1条记录,耗时:%2ms").arg (records).arg(t.elapsed());
IV.数据删除:
//IV.数据删除
t.restart();//重启计时器
query.exec("delete from automobil where id=15") ;//删除id为15的数据
qDebug()<<QObject::tr("删除一条记录,耗时:%1 ms") .arg(t.elapsed()) ;//输出操作耗时
return 0;
//return a.exec() ;
【注意】:以上代码均为Qt5相关代码,Qt6及以上版本取消了QTime类下的t.restart()函数和t.elapsed()函数,将其封装到了QElapsedTimer类中,请使用相应代码代替,完整代码参考:资源。
如果没有看懂的话,完整代码可以参考:https://download.csdn.net/download/didi_ya/76627517
当然,这里也提供了Qt6实现的相关代码,可以参考:https://download.csdn.net/download/didi_ya/76630272
ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~