提示:查询所有记录和条件查询在 *** 作中有,就不单独示例了;源码在本文第三节(源码含详细注释)。
1.1 创建数据表下图为创建数据表的 *** 作,其步骤分为:
- 确保当前没有数据表
- 创建数据表
- 查看数据表是否创建成功
- 查看初始化数据是否成功
下图为添加记录的 *** 作,其步骤分为:
- 查看学生信息表当前内容
- 添加学生信息
- 使用条件查询查询添加的记录(若有则添加成功)
- 因为是sql *** 作,所以需要在pro文件添加“QT += sql”;
- SQLITE是一款开源轻量级的数据库软件,它不需要服务器,也不用进行配置就能使用的数据库;
- SQLITE在使用时无需指定主机名、用户名、密码、端口号等信息,仅指定数据库即可;
提示:源码中的槽函数都是通过ui文件的转到槽功能添加,所有没有连接信号槽的代码
3.1 CDBTest.h#ifndef CDBTEST_H
#define CDBTEST_H
#include
#include
namespace Ui {
class CDBTest;
}
class CDBTest : public QMainWindow
{
Q_OBJECT
public:
explicit CDBTest(QWidget *parent = 0);
~CDBTest();
//! 代码复用的函数
//! 在条件查询和普通查询中的部分代码相同,完全可以封装成一个函数使用;
//! 细心的小伙伴会发现,其实条件查询和普通查询完全可以写成一个函数,有兴趣的话可以试试。
void displayRecord(QSqlQuery query);
private slots:
void on_showTablesBt_clicked(); //显示所有表
void on_selectAllBt_clicked(); //普通查询:查询表中所有信息
void on_selectWhereBt_clicked(); //条件查询
void on_addInfoBt_clicked(); //添加记录
void on_createTableBt_clicked(); //创建数据表
private:
Ui::CDBTest *ui;
QSqlDatabase m_sqliteDB; //sqlite数据库对象
};
#endif // CDBTEST_H
3.2 CDBTest.cpp
#include "CDBTest.h"
#include "ui_CDBTest.h"
#include
#include
#include
#include
#include
#include
CDBTest::CDBTest(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::CDBTest)
{
ui->setupUi(this);
this->setWindowTitle("QSQLITE练习");
//指定数据库类型
m_sqliteDB = QSqlDatabase::addDatabase("QSQLITE");
//指定数据库(若是数据库不存在,会自动创建,不过记得带后缀名哦)
m_sqliteDB.setDatabaseName("./test.db");
if(!m_sqliteDB.open())
{
ui->textBrowser->append(m_sqliteDB.lastError().text());
return;
}
}
CDBTest::~CDBTest()
{
delete ui;
}
void CDBTest::displayRecord(QSqlQuery query)
{
//获取一个记录对象
QSqlRecord rec = query.record();
QString columTitle(""); //用于组列标题的变量
for(int index = 0; index != rec.count(); ++index)
{
//循环获取每个列标题,并添加到列标题字符串中
columTitle.append(rec.fieldName(index) + "\t");
}
//将列标题添加到显示控件中
ui->textBrowser->append(columTitle);
//循环获取每条记录
while (query.next())
{
//将当前记录的数据组成字符串,然后添加到显示控件中
QString record("");
record.append(query.value(0).toString() + "\t");
record.append(query.value(1).toString() + "\t");
record.append(query.value(2).toString() + "\t");
record.append(query.value(3).toString() + "\t");
ui->textBrowser->append(record);
}
ui->textBrowser->append("=========================Run successfully=======================\n");
}
void CDBTest::on_showTablesBt_clicked()
{
ui->textBrowser->append("数据库中的所有表如下:");
foreach (QString table, m_sqliteDB.tables())
{
ui->textBrowser->append(table);
}
ui->textBrowser->append("=========================Run successfully=======================\n");
}
void CDBTest::on_selectAllBt_clicked()
{
QSqlQuery query;
ui->textBrowser->append("StudentsInfo:");
//运行sql语句并判断是否运行成功
bool flag = query.exec("select * from StudentsInfo");
if(!flag)
{
ui->textBrowser->append(query.lastError().text());
return;
}
//调用显示函数显示记录
displayRecord(query);
}
void CDBTest::on_selectWhereBt_clicked()
{
QSqlQuery query;
ui->textBrowser->append("StudentsInfo [age > 18]:");
//运行sql语句并判断是否运行成功
bool flag = query.exec("select * from StudentsInfo where age > 18");
if(!flag)
{
ui->textBrowser->append(query.lastError().text());
return;
}
//调用显示函数显示记录
displayRecord(query);
}
void CDBTest::on_addInfoBt_clicked()
{
//当没有学号和姓名时不能添加
if(ui->sIdEdit->text().isEmpty() || ui->nameEdit->text().isEmpty())
return;
QSqlQuery query;
//组sql语句,并将对用控件的值插入
QString sql = QString("insert into StudentsInfo values('%1', '%2', %3, %4)")
.arg(ui->sIdEdit->text())
.arg(ui->nameEdit->text())
.arg(ui->ageSpinBox->value())
.arg(ui->heightSpinBox->value());
if(query.exec(sql))
ui->textBrowser->append(query.lastError().text());
ui->textBrowser->append("=========================Run successfully=======================\n");
}
void CDBTest::on_createTableBt_clicked()
{
QSqlQuery query;
//创建表的SQL语句
QString sql = "create table StudentsInfo("
"id vchar primary key,"
"name vchar,"
"age int,"
"height int)";
//运行并判断是否创建成功
if(!query.exec(sql))
{
ui->textBrowser->append(query.lastError().text());
return;
}
//为数据表初始化数据,方便做查询 *** 作
sql = "insert into StudentsInfo values('%1', '学生%2', %3, %4)";
srand(QDateTime::currentMSecsSinceEpoch()); //设置随机数的基数
for(int index = 1; index != 4; ++index)
{
QString sqlTemp = sql
//! 含义 字符,字符位数,字符进制,当字符比字符位数少时指定的补位字符
//! 如我这里的补位字符为'0'
.arg(index, 3, 10, QLatin1Char('0'))
.arg(index)
.arg(rand() % 40).arg(rand() % 300);
query.exec(sqlTemp);
}
ui->textBrowser->append("=========================Created successfully=======================\n");
}
总结
源码包含创建数据库(虽然没看出来,但这个数据库其实是自动创建的)、创建数据表、添加记录、查询记录等 *** 作;当然了其中难免有一些BUG,比如创建、查询等功能已经写死了,不能有更灵活的 *** 作,有兴趣的小伙伴可以试着补全。强烈刚开始学习Qt的小伙伴可以做这个练习。
对于SQLITE,在考虑不能接网、考虑电脑性能、便携、配置问题等情况都可以使用哦。
Qt数据库练习之QSqlQuery、QSqlQueryModel的简单使用(含源码+注释)
Qt数据库练习之QSqlTableModel的使用(MySql数据库示例,含源码+注释)
友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 ^o^/)
注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)