目录
指定model使用哪个表&把model设置到tableView并显示数据&把第一个列表改名字
前言:
数据库连接
QT5.12连接MySQL_qt 5.12.12 mysql-CSDN博客
下载Navicat 连接MySQL
项目文件加上sql
每次更改完项目文件都建议执行一遍编译不允许,为了让后面可以检测到
打印查看Qt支持哪些数据库驱动
("QSQLITE", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
QSQLITE:静态数据库(不需要服务器,保存在文件,a.db,类似excel表格),嵌入式常用,C语言开源,提供.h和.c
QODBC,QODBC3:MFC,提供好数据库的接口
QPSQL,QPSQL7:(待补充)
QMYSQL
黑马用的这个,但是我这里没有,那只能去下一个了
噢!之前91一个错误原来是因为qt的编译器和mysql的位数对不上,亏我搞了这么就久
mysql的82位,之前编译我用的32位,今天一换64位就得用了
大佬指路:QT连接MySql数据库失败,编译驱动问题,最详细解决办法_
ohhhhhhhhhhhhhhhhhh,原来我一直都连接成功了!!但是以后写数据库相关都要用64位的项目配置
等等,黑马打开的那个界面是哪来的
Navicat中MySQL命令列界面操作及基础常用命令_navicat命令列界面怎么运行-CSDN博客
Navicat16安装和激活详细讲解(全网最简单且靠谱)_navicat 16-CSDN博客
原来是Navicat
大悲,Navicat连接不了MYSQL
mysql-8.0.30最新密码重置方法,看这一篇就够了_mysql 8.0忘记初始化密码-CSDN博客
‘mysql‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件_mysql' 不是内部或外部命令,也不是可运行的程序 或批处理文件。-CSDN博客
Mysql应用安装后找不到my.ini文件_mysql8.0没有my.ini-CSDN博客
几经多折,其实是我密码忘了,位数没对上,最后用重装解决百分之80的问题
[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String(defaultConnection))
数据库插入
头文件.h
源文件.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QSqlDatabase>
#include <QDebug>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlQuery>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//打印Qt支持的数据库驱动
qDebug()<<QSqlDatabase::drivers();
//添加MYSQl数据库
QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
//连接数据库
db.setHostName("127.0.0.1");//数据库服务器ip
db.setUserName("root");//数据库用户名
db.setPassword("123456");//密码
db.setDatabaseName("info");//使用哪个数据库
//打开数据库
if( !db.open() )//数据库打开失败
{
QMessageBox::warning(this,"错误",db.lastError().text());
return;
}
QSqlQuery query;
query.exec("create table student(id int primary key auto_increment,name varchar(255),age int,score int);");
//create table student(:这行代码开始创建一个新表,表名为 student。
//id int primary key auto_increment,:这行定义了一个名为 id 的列,数据类型为整数(int)。primary key 表示这个列是表的主键,用于唯一地标识表中的每一行。auto_increment 属性表示每当向表中插入新行时,这个列的值会自动增加,从而保证每个 id 的唯一性。
//name varchar(255),:这行定义了一个名为 name 的列,数据类型为可变长字符串(varchar),最大长度为255个字符。
//age int,:这行定义了一个名为 age 的列,数据类型为整数(int),用于存储学生的年龄。
//score int);:这行定义了一个名为 score 的列,数据类型为整数(int),用于存储学生的分数。最后的 ); 表示表定义的结束。
}
Widget::~Widget()
{
delete ui;
}
现象
使用多个数据库时,起名标识和传参数
注意的点
如果不加起名标识,就不需要传参数了
现象
SQL语句
批量插入&odbc风格&占用符号
//批量插入
//odbc风格
//预处理语句
QSqlQuery query;
// ? 相当于 占用符号
query.prepare("insert into student(name,age,score) values(?,?,?);");
//给字段设置内容 list
QVariantList nameList;
nameList <<"小黄"<<"小劳"<<"小白";
QVariantList ageList;
ageList << 11 << 22 << 33;
QVariantList scoreList;
scoreList << 59 << 69 << 79;
//给字段绑定相应的值,按顺序绑定
query.addBindValue(nameList);
query.addBindValue(ageList);
query.addBindValue(scoreList);
//执行预处理命令
query.execBatch();//批量插入
现象
记得在表格内点击刷新
oracle风格&占位符号&绑定字符不局限顺序
//oracle风格
//占位符号 : 自定义名
query.prepare("insert into student(name,age,score) values(:name,:age,:score);");
//给字段设置内容 list
QVariantList nameList;
nameList <<"ad"<<"fs"<<"xcv";
QVariantList ageList;
ageList << 77 << 88 << 11;
QVariantList scoreList;
scoreList << 55 << 66 << 41;
//给字段绑定,不局限于顺序
query.bindValue(":name",nameList);
query.bindValue(":score",scoreList);
query.bindValue(":age",ageList);
//执行预处理命令
query.execBatch();//批量插入
遍历&删除&撤回
query.exec("select * from student where name ='ad'");
while( query.next()) //一行一行遍历
{
//取出当前行的内容
qDebug()<< query.value(0).toInt()
<< query.value(1).toString()
<< query.value("age").toInt()
<< query.value("score").toInt();
}
void Widget::on_ButtonDel_clicked()
{
//获取行编辑
QString name = ui->lineEdit->text();
QString sql = QString("delete from student where name = '%1'").arg(name);
//开始一个事务
QSqlDatabase ::database().transaction();//获取当前操作的是哪个数据库
QSqlQuery query;
query.exec(sql);
}
void Widget::on_ButtonSure_clicked()
{
//确定删除
QSqlDatabase ::database().commit();//获取当前操作的是哪个数据库
}
void Widget::on_ButtonCtrlZ_clicked()
{
//回滚,撤销
QSqlDatabase ::database().rollback();//获取当前操作的是哪个数据库
}
现象
QsqlList
新建工程
建立本地数据库
txt文件改名字即可
插入表&添加内容&设置字段&遍历&打印
//打印Qt支持的数据库驱动
qDebug()<<QSqlDatabase::drivers();
//添加QSQLITE数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");//QSqlite不能够自动累加,不可用auto_incnement
//设置数据库
db.setDatabaseName("../info.db");
//打开数据库
if( !db.open() )//数据库打开失败
{
QMessageBox::warning(this,"错误",db.lastError().text());
return;
}
QSqlQuery query;
query.exec("create table student("
"id int primary key,"
"name varchar(255),"
"age int,"
"score int);");
query.prepare("insert into student(name,age,score) values(?,?,?);");
//给字段设置内容 list
QVariantList nameList;
nameList <<"小黄"<<"小劳"<<"小白";
QVariantList ageList;
ageList << 11 << 22 << 33;
QVariantList scoreList;
scoreList << 59 << 69 << 79;
//给字段绑定相应的值,按顺序绑定
query.addBindValue(nameList);
query.addBindValue(ageList);
query.addBindValue(scoreList);
//执行预处理命令
query.execBatch();//批量插入
//遍历&&打印
query.exec("select * from student");
while( query.next()) //一行一行遍历
{
//取出当前行的内容
qDebug()<< query.value(0).toInt()
<< query.value(1).toString()
<< query.value("age").toInt()
<< query.value("score").toInt();
}
现象
数据库可视化操作
添加数据库到项目工程
//打印Qt支持的数据库驱动
qDebug()<<QSqlDatabase::drivers();
//添加MYSQl数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
//连接数据库
db.setHostName("127.0.0.1");//数据库服务器ip
db.setUserName("root");//数据库用户名
db.setPassword("123456");//密码
db.setDatabaseName("info");//使用哪个数据库
//打开数据库
if( !db.open() )//数据库打开失败
{
QMessageBox::warning(this,"错误",db.lastError().text());
return;
}
model设置模型
#include <QSqlTableModel>
QSqlTableModel *model;
指定model使用哪个表&把model设置到tableView并显示数据&把第一个列表改名字
//设置模型
model = new QSqlTableModel (this);
model->setTable("student");//指定使用哪个表
//把model设置view
ui->tableView->setModel(model);
//显示model里的数据
model->select();
model->setHeaderData(0,Qt::Horizontal,"学号");
添加行&提交动作
void Widget::on_ButtonAdd_clicked()
{
//添加空记录
QSqlRecord record= model->record();//获取空记录
//获取行号
int row =model->rowCount();
model->insertRecord(row,record);
}
void Widget::on_ButtonSure_clicked()
{
model->submitAll();//提交动作
}
现象
取消&删除
void Widget::on_ButtonCanadian_clicked()
{
model->revertAll();//取消所有动作
model->submitAll();//提交动作
}
void Widget::on_ButtonDel_clicked()
{
//获取选择的模型
QItemSelectionModel*sModel=ui->tableView->selectionModel();
//取出模型中的索引
QModelIndexList list=sModel->selectedRows();
//删除所有选中的行
for(int i =0;i<list.size();i++)
{
model->removeRow(list.at(i).row());
}
}
现象
查找
void Widget::on_ButtonFinal_clicked()
{
//获取内容
QString name=ui->lineEdit->text();
QString str=QString("name ='%1'").arg(name);
model->setFilter(str);
model->select();
}