用 QT 实现数据库的增删改查
QT 随便整几个控件 + 4 个按钮
可以用 navicat 打开看一下
数据库初始化
//初始化
bool bmysqlInit(){
//1、打印驱动列表
qDebug()<<QSqlDatabase::drivers();
//2、检测已连接的方式 - 默认连接名
if(QSqlDatabase::contains("qt_sql_default_connection")){
mydb = QSqlDatabase::database("qt_sql_default_connection");
}
else{
mydb = QSqlDatabase::addDatabase("QSQLITE");
}
//3、设置数据库路径,不存在则创建
mydb.setDatabaseName("flechazo.db");
//4、测试打开
if(mydb.open()){
qDebug()<<"open success";
bmysqlcreattable();
}else{
//打印sql语句错误信息
qDebug()<<"init table error"<<mydb.lastError();
return false;
}
return true;
}
bool bmysqlcreattable(){
//sql语句不熟悉的推荐《sql必知必会》,轻松入门
//如果不存在则创建my_table表
//id自增,name唯一
const QString sql=R"(
CREATE TABLE IF NOT EXISTS my_table (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
name CHAR (50) UNIQUE NOT NULL,
age INTEGER
);)";
//QSqlQuery构造前,需要mydb已打开并连接
//未指定mydb或者mydb无效时使用默认连接进行操作
QSqlQuery query;
if(query.exec(sql)){
qDebug()<<"init table success";
}else{
//打印sql语句错误信息
qDebug()<<"init table error"<<query.lastError();
return false;
}
return true;
}
增删改查
//插入数据
bool bmysqlinsert(const QString &name, int age)
{
QSqlQuery query;
//绑定值,待定变量默认问号,可自定义
query.prepare(R"(INSERT INTO my_table(name,age) VALUES(?,?);)");
query.addBindValue(name);
query.addBindValue(age);
if(query.exec()){
qDebug()<<"insert successful!";
}else{
//打印sql语句错误信息
qDebug()<<"init table error"<<query.lastError();
return false;
}
return true;
}
//删除数据
bool bmysqldelete(const QString &name)
{
QSqlQuery query;
query.prepare(R"(DELETE FROM my_table WHERE name=?;)");
query.addBindValue(name);
if(query.exec()){
qDebug()<<"insert successful!";
}else{
//打印sql语句错误信息
qDebug()<<"init table error"<<query.lastError();
return false;
}
return true;
}
//更新数据
bool vmysqlupdate(const QString &name, int age)
{
QSqlQuery query;
//绑定值,待定变量默认问号,可自定义
query.prepare(R"(UPDATE my_table SET age=:age WHERE name=:name;)");
query.bindValue(":name",name);//通过自定义的别名来替代
query.bindValue(":age",age);
if(query.exec()){
qDebug()<<"insert successful!";
}else{
//打印sql语句错误信息
qDebug()<<"init table error"<<query.lastError();
return false;
}
return true;
}
//查询数据
int imysqlsearch(const QString &name)
{
QSqlQuery query;
query.exec(QString(R"(SELECT age FROM my_table WHERE name='%1';)")
.arg(name));
//获取查询结果的第0个值,
//如果结果是多行数据,可用while(query.next()){}遍历每一行
int ageValue=-1;
if(query.next()){
ageValue=query.value(0).toInt();
}
qDebug()<<ageValue;
return ageValue;
}
完整的代码,具体的项目很乱没有整理
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QMessageBox>
static QSqlDatabase mydb;
bool bmysqlcreattable();
//初始化
bool bmysqlInit(){
//1、打印驱动列表
qDebug()<<QSqlDatabase::drivers();
//2、检测已连接的方式 - 默认连接名
if(QSqlDatabase::contains("qt_sql_default_connection")){
mydb = QSqlDatabase::database("qt_sql_default_connection");
}
else{
mydb = QSqlDatabase::addDatabase("QSQLITE");
}
//3、设置数据库路径,不存在则创建
mydb.setDatabaseName("flechazo.db");
//4、测试打开
if(mydb.open()){
qDebug()<<"open success";
bmysqlcreattable();
}else{
//打印sql语句错误信息
qDebug()<<"init table error"<<mydb.lastError();
return false;
}
return true;
}
bool bmysqlcreattable(){
//sql语句不熟悉的推荐《sql必知必会》,轻松入门
//如果不存在则创建my_table表
//id自增,name唯一
const QString sql=R"(
CREATE TABLE IF NOT EXISTS my_table (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
name CHAR (50) UNIQUE NOT NULL,
age INTEGER
);)";
//QSqlQuery构造前,需要mydb已打开并连接
//未指定mydb或者mydb无效时使用默认连接进行操作
QSqlQuery query;
if(query.exec(sql)){
qDebug()<<"init table success";
}else{
//打印sql语句错误信息
qDebug()<<"init table error"<<query.lastError();
return false;
}
return true;
}
//插入数据
bool bmysqlinsert(const QString &name, int age)
{
QSqlQuery query;
//绑定值,待定变量默认问号,可自定义
query.prepare(R"(INSERT INTO my_table(name,age) VALUES(?,?);)");
query.addBindValue(name);
query.addBindValue(age);
if(query.exec()){
qDebug()<<"insert successful!";
}else{
//打印sql语句错误信息
qDebug()<<"init table error"<<query.lastError();
return false;
}
return true;
}
//删除数据
bool bmysqldelete(const QString &name)
{
QSqlQuery query;
query.prepare(R"(DELETE FROM my_table WHERE name=?;)");
query.addBindValue(name);
if(query.exec()){
qDebug()<<"insert successful!";
}else{
//打印sql语句错误信息
qDebug()<<"init table error"<<query.lastError();
return false;
}
return true;
}
//更新数据
bool vmysqlupdate(const QString &name, int age)
{
QSqlQuery query;
//绑定值,待定变量默认问号,可自定义
query.prepare(R"(UPDATE my_table SET age=:age WHERE name=:name;)");
query.bindValue(":name",name);//通过自定义的别名来替代
query.bindValue(":age",age);
if(query.exec()){
qDebug()<<"insert successful!";
}else{
//打印sql语句错误信息
qDebug()<<"init table error"<<query.lastError();
return false;
}
return true;
}
//查询数据
int imysqlsearch(const QString &name)
{
QSqlQuery query;
query.exec(QString(R"(SELECT age FROM my_table WHERE name='%1';)")
.arg(name));
//获取查询结果的第0个值,
//如果结果是多行数据,可用while(query.next()){}遍历每一行
int ageValue=-1;
if(query.next()){
ageValue=query.value(0).toInt();
}
qDebug()<<ageValue;
return ageValue;
}
void MainWindow::on_pushButton_mysql_open_clicked()
{
//检测已连接的方式 - 自定义连接名
if(QSqlDatabase::contains("flechazo_mysql"))
mydb = QSqlDatabase::database("flechazo_mysql");
else
mydb = QSqlDatabase::addDatabase("QSQLITE","flechazo_mysql");
//设置数据库路径,不存在则创建
mydb.setDatabaseName("flechazo.db");
//SQLite不需要用户名和密码
//mydb.setUserName("flechazo");
//mydb.setPassword("unique");
//打开数据库
if(mydb.open()){
qDebug()<<"open success";
}
}
void MainWindow::on_pushButton_mysql_close_clicked()
{
//关闭数据库
mydb.close();
}
void MainWindow::on_pushButton_add_clicked()
{
QString name = ui->lineEdit_mysql_creat_excel_number->text();
int age = ui->lineEdit_mysql_creat_excel_time->text().toInt();
bmysqlinsert(name,age);
qDebug()<<"insert successful!";
}
void MainWindow::on_pushButton_read_clicked()
{
//读出数据库
QString name=ui->lineEdit_mysql_creat_excel_number->text();
ui->lineEdit_mysql_creat_excel_time->setText(QString::number(imysqlsearch(name)));
qDebug()<<"read successful!";
}