前言:笔者上课的实验报告,开发平台是Win11 64位+Microsoft SQL Server Management Studio +Qt Creator 4.11.0开发环境。
一、连接数据库
(1)设置用户登录
打开Microsoft SQL Server Management Studio,登录时选择windows 身份验证。
去往安全性,选择登录名,右击新建登录名。
在【常规】中修改登录名和密码,并把默认数据库更改为所需的数据库名称。
在【用户映射】中,选择需要映射的数据库和用户名。确保 db_owner 勾选,否则能连接数据库,但是不能数据库“增删改查”操作。
在【状态】中,将如下选项选择授予“启用”状态。
打开SQL Sever 2022配置服务器,确保TCP/IP启用。
双击 TCP/IP 在IP地址栏中查看服务器的IP地址以及端口,并记录下来。
(2)配置ODBC数据源
打开ODBC 数据源,并选择新建,选择 SQL Server。
将事先记录下来的服务器IP地址粘贴进来。
点击下一页,选择使用用户登录,并输入刚刚创建的账号及密码。
点击下一页,点击完成,点击测试数据源。
显示测试成功。
(3)关键代码实现
db = QSqlDatabase::addDatabase("QODBC"); //数据库驱动类型为SQL Server
qDebug()<<"ODBC driver?"<<db.isValid();
QString dsn = QString::fromLocal8Bit("lab3");//数据源名称,就是刚才的 名称
db.setHostName("fe80::5f23:def:f6c:3bac%11"); //选择本地主机,127.0.1.1
db.setDatabaseName(dsn); //设置数据源名称
db.setUserName("syy"); //登录用户
db.setPassword("Akelly15714"); //密码
if(!db.open()) //打开数据库
{
QMessageBox::information(this, "提示","数据库连接失败");
this->close();
qDebug()<<"数据库连接失败";
}
else
{
QMessageBox::information(this, "提示","数据库连接成功");
qDebug()<<"数据库连接成功";
}
//若数据库中没有表,则新建
QSqlQuery query;
QString createTableUser="create table if not exists user(name varchar(8),birth int(255), "
"sex varchar(8), number int(255));";
query.exec(createTableUser);
(4)运行界面
二、实现“增删改查”功能。
(1)运行界面
查询:
增加:
删除:
修改:
三、完整代码
#ifndef WIDGET_H
#define WIDGET_H
#include <QMainWindow>
#include <QMessageBox>
#include <QPushButton>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QSqlQueryModel>
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void ReshowTable();
void on_pushButton_connectDataBase_clicked();
void on_pushButton_query_clicked();
void on_pushButton_add_clicked();
void on_pushButton_delete_clicked();
void on_pushButton_change_clicked();
void on_tableView_pressed(const QModelIndex &index);
private:
Ui::Widget *ui;
QSqlDatabase db;
QSqlQueryModel *userMode;//数据模型
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
userMode = new QSqlQueryModel(this);//绑定
QPushButton * btn1 = new QPushButton;
btn1->setParent(this);
btn1->setText("连接数据库");
btn1->resize(112,34);
btn1->move(550,30);
connect(btn1,&QPushButton::clicked,this,&Widget::on_pushButton_connectDataBase_clicked);
QPushButton * btn2 = new QPushButton;
btn2->setParent(this);
btn2->setText("增加");
btn2->resize(112,34);
btn2->move(550,130);
connect(btn2,&QPushButton::clicked,this,&Widget::on_pushButton_add_clicked);
QPushButton * btn3 = new QPushButton;
btn3->setParent(this);
btn3->setText("删除");
btn3->resize(112,34);
btn3->move(550,180);
connect(btn3,&QPushButton::clicked,this,&Widget::on_pushButton_delete_clicked);
QPushButton * btn4 = new QPushButton;
btn4->setParent(this);
btn4->setText("修改");
btn4->resize(112,34);
btn4->move(550,230);
connect(btn4,&QPushButton::clicked,this,&Widget::on_pushButton_change_clicked);
QPushButton * btn5 = new QPushButton;
btn5->setParent(this);
btn5->setText("查询");
btn5->resize(112,34);
btn5->move(550,80);
connect(btn5,&QPushButton::clicked,this,&Widget::on_pushButton_query_clicked);
connect(ui->tableView,&QTableView::clicked,this,&Widget::on_tableView_pressed);
}
Widget::~Widget()
{
delete ui;
}
void Widget::ReshowTable()
{
userMode->setHeaderData(0,Qt::Horizontal,tr("姓名"));
userMode->setHeaderData(1,Qt::Horizontal,tr("出生年月"));
userMode->setHeaderData(2,Qt::Horizontal,tr("性别"));
userMode->setHeaderData(3,Qt::Horizontal,tr("学号"));
ui->tableView->setModel(userMode);
}
void Widget::on_pushButton_connectDataBase_clicked()
{
db = QSqlDatabase::addDatabase("QODBC"); //数据库驱动类型为SQL Server
qDebug()<<"ODBC driver?"<<db.isValid();
QString dsn = QString::fromLocal8Bit("lab3");//数据源名称
db.setHostName("fe80::5f23:def:f6c:3bac%11"); //选择本地主机
db.setDatabaseName(dsn); //设置数据源名称
db.setUserName("syy"); //登录用户
db.setPassword("Akelly15714"); //密码
if(!db.open()) //打开数据库
{
QMessageBox::information(this, "提示","数据库连接失败");
this->close();
qDebug()<<"数据库连接失败";
}
else
{
QMessageBox::information(this, "提示","数据库连接成功");
qDebug()<<"数据库连接成功";
}
//若数据库中没有表,则新建
QSqlQuery query;
QString createTableUser="create table if not exists user(name varchar(8),birth int(255), "
"sex varchar(8), number int(255));";
query.exec(createTableUser);
}
//添加
void Widget::on_pushButton_add_clicked()
{
if(ui->lineEdit_name->text() == ""){
QMessageBox::critical(this,"提示","姓名不能为空!");
return;
}
if(ui->lineEdit_birth->text() == ""||!ui->lineEdit_birth->text().toInt()){
QMessageBox::critical(this,"提示","出生年月不能为空且必须为数字!");
return;
}
if(ui->lineEdit_sex->text() == ""){
QMessageBox::critical(this,"提示","性别不能为空!");
return;
}
if(ui->lineEdit_number->text() == ""||!ui->lineEdit_number->text().toInt()){
QMessageBox::critical(this,"提示","学号不能为空且必须为数字!");
return;
}
QString name = ui->lineEdit_name->text();
QString birth = ui->lineEdit_birth->text();
QString sex = ui->lineEdit_sex->text();
QString number = ui->lineEdit_number->text();
QSqlQuery query;
query.prepare("insert into stu1(name, birth, sex, number) values(:name,:birth,:sex,:number)");
query.bindValue(":name", name);
query.bindValue(":birth", birth);
query.bindValue(":sex", sex);
query.bindValue(":number", number);
if(query.exec()){
QMessageBox::critical(this,"提示","新增成功!");
qDebug()<<"新增数据成功";
return;
}
else{
QMessageBox::critical(this,"提示","新增失败!");
qDebug()<<"新增数据失败";
return;
}
userMode->setQuery("select * from stu1");
ReshowTable();
}
//删除
void Widget::on_pushButton_delete_clicked()
{
QSqlQuery query;
int currentrow = ui->tableView->currentIndex().row();
userMode->removeRow(currentrow);
if(currentrow != -1)//若选中一行
{
int ok = QMessageBox::warning(this,tr("删除当前行!"),tr("你确定删除当前行吗?"), QMessageBox::Yes,QMessageBox::No);
//如确认删除
if(ok == QMessageBox::Yes)
{
userMode->removeRow(currentrow);
QString name = userMode->data(userMode->index(currentrow,0)).toString();//获取姓名
QString del = "delete from stu1 where name='" + name + "';";
query.exec(del);
userMode->setQuery("select * from stu1");
ui->tableView->setModel(userMode);
QMessageBox::information(this, "删除成功", "所选信息删除成功");
}
}
else
QMessageBox::information(this, "提示", "请选择你要删除的信息行");
}
void Widget::on_pushButton_change_clicked()
{
QSqlQuery query;
QString str = "update stu1 set name='" + ui->lineEdit_name->text() + "',birth='" + ui->lineEdit_birth->text() + "',sex='" + ui->lineEdit_sex->text() + "' where number='" + ui->lineEdit_number->text() + "';";
// query.exec(str);
if(query.exec(str)){
QMessageBox::critical(this,"提示","修改成功!");
qDebug()<<"修改数据成功";
userMode->setQuery("select * from stu1");
ReshowTable();
//return;
}
else{
QMessageBox::critical(this,"提示","修改失败!");
qDebug()<<"修改数据失败";
return;
}
}
void Widget::on_tableView_pressed(const QModelIndex &index)
{
QString name = userMode->data(userMode->index(index.row(), 0)).toString();
QString birth = userMode->data(userMode->index(index.row(), 1)).toString();
QString sex = userMode->data(userMode->index(index.row(), 2)).toString();
QString number = userMode->data(userMode->index(index.row(), 3)).toString();
ui->lineEdit_name->setText(name);
ui->lineEdit_birth->setText(birth);
ui->lineEdit_sex->setText(sex);
ui->lineEdit_number->setText(number);
}
//查询
void Widget::on_pushButton_query_clicked()
{
userMode->setQuery("select * from stu1");
ui->tableView->setModel(userMode);
ReshowTable();
}
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}