数据库实验三:应用程序访问数据库

本文详细描述了在Win11环境下,使用MicrosoftSQLServerManagementStudio和QtCreator4.11.0开发环境中,如何连接数据库、配置ODBC数据源,以及实现基础的增删改查功能的步骤。
摘要由CSDN通过智能技术生成
前言:笔者上课的实验报告,开发平台是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();
}

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值