c# 图书管理系统(数据库)

数据库基础

SQL 是 Structured Query Language 的缩写,中文译为“结构化查询语言”。SQL 是一种计算机语言,用来存储、检索和修改关系型数据库中存储的数据。

基本概念

1、数据库(DataBase)

  • 按照一定数据结构来组织、存储和管理数据的仓库。存储在一起的相关数据的集合。

2、数据库管理系统(DataBase Management System ,DBMS)

  • 为管理数据库而设计的一个电脑软件系统。我们用的是微软出的 SQL Server Management Studio
  • 分为两种:关系数据库,建立在关系模型基础上的数据库,如SqlServer MySQL Access Oaracle;非关系数据库:不同点,不使用SQL作为查询语言。

3、数据库系统

  • 数据库和数据库管理系统组成。

4、sql是大小写不敏感的,但还是大小写分开写比较好

安装

视频

数据库管理系统(database management system,DBMS),Microsoft SQL Server
DBMS是后台运行的一组服务,要与这组服务打交道就需要下载客户端,也就是DBMS客户端,SQL server management studio,SSMS

示例数据库
在这里插入图片描述
在这里插入图片描述

登录

 Server=localhost\SQLEXPRESS;Database=master;Trusted_Connection=True;
 前面是服务器名 后面是数据库名字 

自己电脑直接这样登录 c# 里面也是这样登录的
在这里插入图片描述

开启远程连接

外网可以连接 但是用自己电脑不能连接
1、可以先使用Windows验证登录 将这个勾选上
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
2、SQL Server配置管理器
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3、防火墙
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后重启一下
在这里插入图片描述

SQL

数据库管理系统(database management system,DBMS),Microsoft SQL Server
DBMS是后台运行的一组服务,要与这组服务打交道就需要下载客户端,也就是DBMS客户端,SQL server management studio,SSMS
在这里插入图片描述
Server=localhost\SQLEXPRESS;Database=master;Trusted_Connection=True;

新建数据库

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

新建表

在这里插入图片描述
设置主键
在这里插入图片描述

ctrl s保存
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查询语句

select * from t_user where id='1001' and psw='1'

在这里插入图片描述

插入数据

那个3和10是int类型 单引号不用也没关系

insert into t_book values('20190101','计算机系统原理','王万森','高等教育出版社','10'),('20190102','机械设计原理','董永','北京教育出版社','3')
select * from t_book

在这里插入图片描述
另外一种插入方式,后来又试了一下 不加[]也没关系.好像规范的话 就是要每项都要加[ ]的

insert into t_lend  ([uid],bid,name,[datetime]) values('2046','20190101','小明',getdate());
update t_book set number=number-1 where id='20190101'
select *from t_lend
select *from t_book

在这里插入图片描述
下面这样设置 就会自增
在这里插入图片描述

更新

update t_book set id='111',[name]='高等数学',author='李四',number=100 where id='999'
select * from t_book

在这里插入图片描述
在这里插入图片描述
当想设置某个表的有个项自增时
在这里插入图片描述

删除

delete from t_lend where [no]=5;
update t_book set number=number+1 where id='20190101'
select *from t_lend
select *from t_book

在这里插入图片描述
在这里插入图片描述

多行查找

在这里插入图片描述
在这里插入图片描述

多行删除

delete from t_lend where [no] in('6','7')
select *from t_lend
select *from t_book

在这里插入图片描述
在这里插入图片描述

数据库设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

c#程序设计

Dao.cs

封装了与sql通信的函数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace WindowsFormsApp1
{
    
    
     class Dao
    {
    
    
        SqlConnection con;
        public SqlConnection connect()
        {
    
    
            //数据库连接字符串
            //string str = @"Data Source=localhost\SQLEXPRESS;Initial Catalog = BookDB;Integrated_Security=True";//Data Source:服务器的名称;Initial Catalog:数据库的名称
            string str = @"Data Source=localhost\SQLEXPRESS;Database = BookDB; Trusted_Connection = True;";//也就是我们安装的时候返回的连接字符串 然后将数据库的名字修改了下
            con = new SqlConnection(str);//创建数据库连接对象
            con.Open();//打开数据库
            return con;//返回数据库连接对象
        }

        //sql:sql语句
        public SqlCommand command(string sql)
        {
    
    
            SqlCommand cmd = new SqlCommand(sql,connect());
            return cmd;
        }
        //更新操作
        public int Execute(string sql)
        {
    
    
            return command(sql).ExecuteNonQuery();
        }

        //读取操作
        public SqlDataReader read(string sql)
        {
    
    
            return command(sql).ExecuteReader();//首先执行的是command这个函数 然后返回cmd 再cmd.ExecuteReader()
        }

        //关闭数据库连接
        public void Close()
        {
    
    
            con.Close();
        }
    }
}

Data.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApp1
{
    
    
    class Data
    {
    
    
        public static string UID = "", UName = "";//登录用户的ID 和姓名


    }
}

登录页面

也就是验证输入的数据在t_user和t_admin表中是否存在(需同时满足账户和密码这两项),存在则跳转页面
在这里插入图片描述

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

核心代码 登录方法

        //登录方法,验证是否允许登录
        public void login()
        {
    
    
            //用户
            if(UserradioButton1.Checked==true)
            {
    
    
                Dao dao = new Dao();//实例化
                
                //查询语句 拼成这样:select * from t_user where id='1001' and psw='1'
                //string sql = "select * from t_user where id='"+ textBox1.Text +"' and psw='"+textBox2.Text+"'";//写法1
                //string sql=string.Format("select * from t_user where id='{0}' and psw='{1}'",textBox1.Text,textBox2.Text);//写法2
                string sql = $"select * from t_user where id='{
      
      textBox1.Text}' and psw='{
      
      textBox2.Text}'";//写法3 
                log.SaveLog(sql);
                IDataReader dc = dao.read(sql);
                //log.SaveLog(dc[0].ToString()+dc["name"].ToString());//第一行

                if (dc.Read())//如果读到一行数据了 就返回真
                {
    
    
                    //把值存好
                    Data.UID = dc["id"].ToString();
                    Data.UName=dc["name"].ToString();

                    MessageBox.Show("登录成功");

                    UserFrm userFrm = new UserFrm();
                    this.Hide();
                    userFrm.Show();
                }
                else
                {
    
    
                    MessageBox.Show("登录失败");              
                }
                dao.Close();
                

            }
            //管理员
            if(AdmiradioButton2.Checked==true)
            {
    
    
                Dao dao = new Dao();//实例化

                string sql = $"select * from t_admin where id='{
      
      textBox1.Text}' and psw='{
      
      textBox2.Text}'";//写法3 
                log.SaveLog(sql);
                IDataReader dc = dao.read(sql);
               

                if (dc.Read())//如果读到一行数据了 就返回真
                {
    
    
                    //把值存好
                    Data.UID = dc["id"].ToString();
                   // Data.UName=dc["name"].ToString();

                    MessageBox.Show("登录成功");
                    //log.SaveLog(dc[0].ToString() + dc["name"].ToString());//第一行
                    AdminFrm frm= new AdminFrm();
                    this.Hide();
                    frm.ShowDialog();
                    
                    
                }
                else
                {
    
    
                    MessageBox.Show("登录失败");
                   
                }
                dao.Close();
            }
            //MessageBox.Show("单选框请先选中");
            
           
        }

登录按钮

        private void button1_Click(object sender, EventArgs e)
        {
    
    
            if(textBox1.Text!="" && textBox2.Text!="")
            {
    
    
                login();
            }
            else
            {
    
    
                MessageBox.Show("输入有空项,请输入");
            }

        }

管理员主页

主要做一个跳转的作用 然后加入一个关闭回调函数,关闭这个页面就退出程序
在这里插入图片描述

        public AdminFrm()
        {
    
    
            InitializeComponent();
            this.FormClosing += new FormClosingEventHandler(this.NI_FormClosing);
        }
        private void NI_FormClosing(object sender, FormClosingEventArgs e)
        {
    
    
            Application.Exit();
        }


        private void 图书管理ToolStripMenuItem_Click(object sender, EventArgs e)
        {
    
    
            BookManageFrm frm = new BookManageFrm();
            frm.ShowDialog();
        }

图书管理页面

也就是操作t_book中的数据 增加一行 修改一行 删除一行 然后找其中的某一行
在这里插入图片描述
获取图书数据函数

        //从数据库读取数据显示在表格控件中
        public void Fresh()
        {
    
    
            dataGridView1.Rows.Clear();//清空旧数据
            Dao dao = new Dao();
            string sql = "select * from t_book";
            IDataReader dc = dao.read(sql);
            string a0,a1, a2,a3, a4,a5;
            //dc.Read():一行一行的读 读到没有了就会返回一个false
            while (dc.Read())
            {
    
    
                //dataGridView1.Rows.Add(dc[0].ToString(), dc[1].ToString(), dc[2].ToString(), dc[3].ToString(), dc[4].ToString());
                //下面这样写和上面这样写 效果是一样的
                a0 = dc[0].ToString();
                a1 = dc[1].ToString();
                a2 = dc[2].ToString();
                a3 = dc[3].ToString();
                a4 = dc[4].ToString();
                string[] table = {
    
    a0,a1,a2,a3,a4};
                dataGridView1.Rows.Add(table);
            }
            //关闭 System.Data.IDataReader 对象。
            dc.Close();
            //关闭数据库连接
            dao.Close();
        }

根据id查询函数

        //根据ID查询
        public void InquireId()
        {
    
    
            dataGridView1.Rows.Clear();//清空旧数据
            Dao dao = new Dao();
            string sql = $"select * from t_book where id='{
      
      textBox1.Text}'";
            IDataReader dc = dao.read(sql);
            string a0, a1, a2, a3, a4, a5;
            //dc.Read():一行一行的读 读到没有了就会返回一个false
            while (dc.Read())
            {
    
    
                //dataGridView1.Rows.Add(dc[0].ToString(), dc[1].ToString(), dc[2].ToString(), dc[3].ToString(), dc[4].ToString());
                //下面这样写和上面这样写 效果是一样的
                a0 = dc[0].ToString();
                a1 = dc[1].ToString();
                a2 = dc[2].ToString();
                a3 = dc[3].ToString();
                a4 = dc[4].ToString();
                string[] table = {
    
     a0, a1, a2, a3, a4 };
                dataGridView1.Rows.Add(table);
            }
            //关闭 System.Data.IDataReader 对象。
            dc.Close();
            //关闭数据库连接
            dao.Close();
        }

根据书名查询函数

        //根据书名查询 模糊查询
        public void InquireName()
        {
    
    
            dataGridView1.Rows.Clear();//清空旧数据
            Dao dao = new Dao();
            string sql = $"select * from t_book where name like '%{
      
      textBox2.Text}%'";
            IDataReader dc = dao.read(sql);
            string a0, a1, a2, a3, a4, a5;
            //dc.Read():一行一行的读 读到没有了就会返回一个false
            while (dc.Read())
            {
    
    
                //dataGridView1.Rows.Add(dc[0].ToString(), dc[1].ToString(), dc[2].ToString(), dc[3].ToString(), dc[4].ToString());
                //下面这样写和上面这样写 效果是一样的
                a0 = dc[0].ToString();
                a1 = dc[1].ToString();
                a2 = dc[2].ToString();
                a3 = dc[3].ToString();
                a4 = dc[4].ToString();
                string[] table = {
    
     a0, a1, a2, a3, a4 };
                dataGridView1.Rows.Add(table);
            }
            //关闭 System.Data.IDataReader 对象。
            dc.Close();
            //关闭数据库连接
            dao.Close();
        }

BookManageFrm_Load

        private void BookManageFrm_Load(object sender, EventArgs e)
        {
    
    
            Fresh();
            string id = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
            label2.Text = id + dataGridView1.SelectedRows[0].Cells[1].Value.ToString();//书名+书号
        }

添加图书按钮

            AddBookFrm frm=new AddBookFrm();
            frm.ShowDialog();//打开增加图书页面
            Fresh();//刷新页面

修改图书按钮,显示修改图书页面 并肩参数传递进去

            try
            {
    
    
                string id= dataGridView1.SelectedRows[0].Cells[0].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
                string name = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
                string author = dataGridView1.SelectedRows[0].Cells[2].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
                string press = dataGridView1.SelectedRows[0].Cells[3].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
                string number = dataGridView1.SelectedRows[0].Cells[4].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
                AltBookFrm altBookFrm = new AltBookFrm(id,name,author,press,number);
                altBookFrm.ShowDialog();

                Fresh();//刷新数据
            }
            catch
            {
    
    
                MessageBox.Show("error");
            }

删除图书

            try
            {
    
    

                string id = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();//选中的第0行 第0个单元格 也就是书号(主键)
                DialogResult dr=MessageBox.Show("确认删除吗?","信息提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);
                if(dr==DialogResult.OK)
                {
    
    
                    string sql = $"delete from t_book where id='{
      
      id}'";
                    Dao dao =new Dao();
                    if(dao.Execute(sql)>0)
                    {
    
    
                        MessageBox.Show("删除成功");
                        Fresh();
                    }
                    else
                    {
    
    
                        MessageBox.Show("删除失败");
                    }
                    dao.Close();
                }

            }
            catch
            {
    
    
                MessageBox.Show("请先在表格选中要删除的图书记录","信息提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
            }

刷新

        private void button4_Click(object sender, EventArgs e)
        {
    
    
            Fresh();
            textBox1.Text = "";
            textBox2.Text = "";
        }

书号查询和书名查询 调用上面的函数就可以了

        private void button5_Click(object sender, EventArgs e)
        {
    
    
            InquireId();
        }

        private void button6_Click(object sender, EventArgs e)
        {
    
    
            InquireName();
        }

多行删除

            int n = dataGridView1.SelectedRows.Count;//获取当前选中的行数
            string sql = $"delete from t_book where id in (";
            for(int i = 0; i < n; i++)
            {
    
    
                sql += $"'{
      
      dataGridView1.SelectedRows[i].Cells[0].Value.ToString()}',";
            }
            sql = sql.Remove(sql.Length - 1);//删除最后一个字符 因为是从0开始计的
            sql += ")";
            log.SaveLog(sql);
            Dao dao = new Dao();
            if(dao.Execute(sql)>n-1)//受影响的行数大于n-1
            {
    
    
                MessageBox.Show($"成功删除{
      
      n}条图书信息");
                Fresh();
            }

添加图书页面

在这里插入图片描述
添加图书按钮

           if(textBox1.Text!=""&& textBox2.Text != "" && textBox3.Text != "" && textBox4.Text != "" && textBox5.Text != "")
           {
    
    

            Dao dao = new Dao();
            
            string sql = $"insert into t_book values('{
      
      textBox1.Text}','{
      
      textBox2.Text}','{
      
      textBox3.Text}','{
      
      textBox4.Text}','{
      
      textBox5.Text}')";
            int n =dao.Execute(sql);
            if(n> 0)
            {
    
    
                MessageBox.Show("添加成功");
            }
            else
            {
    
    
                MessageBox.Show("添加失败");
            }

            textBox1.Text = "";
            textBox2.Text = "";
            textBox3.Text = "";
            textBox4.Text = "";
            textBox5.Text = "";
           }
           else
            {
    
    
                MessageBox.Show("输入不允许空");
            }

清空按钮

            textBox1.Text = "";
            textBox2.Text = "";
            textBox3.Text = "";
            textBox4.Text = "";
            textBox5.Text = "";

修改图书页面

在这里插入图片描述

string ID = "";//登录用户的ID 刚登录的时候就保存在data.cs中

再创建带有参数的构造函数 用来接收传递进来的参数


        public AltBookFrm()
        {
    
    
            InitializeComponent();
        }

        public AltBookFrm(string id,string name,string author,string press,string number)
        {
    
    
            InitializeComponent();
            ID =textBox1.Text = id;
            textBox2.Text = name;
            textBox3.Text = author;
            textBox4.Text = press;
            textBox5.Text = number;
        }

修改按钮

            string sql = $"update t_book set id='{
      
      textBox1.Text}',[name]='{
      
      textBox2.Text}',author='{
      
      textBox3.Text}',press='{
      
      textBox4.Text}',number={
      
      textBox5.Text} where id='{
      
      ID}'";
            Dao dao = new Dao();
            if(dao.Execute(sql)>0)
            {
    
    
                MessageBox.Show("修改成功");
            }

用户页面

做一个跳转 关闭这个页面 就关闭应用程序
在这里插入图片描述
关闭则退出

        public UserFrm()
        {
    
    
            InitializeComponent();
            label1.Text = $"欢迎{
      
      Data.UName}登录";
            this.FormClosing += new FormClosingEventHandler(this.NI_FormClosing);

        }
        private void NI_FormClosing(object sender, FormClosingEventArgs e)
        {
    
    
            Application.Exit();
        }

就是做一个跳转

        private void 当前借出图书和归还ToolStripMenuItem_Click(object sender, EventArgs e)
        {
    
    
            UserBookCheckFrm u=new UserBookCheckFrm();
            u.Show();
            
        }



        private void 图书归还ToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
    
    
             UserBookCondition userc=new UserBookCondition();
            userc.Show();
        }

查看图书和借阅

实际操作的就是t_lend和t_book这两个页面,t_lend页面增加一行数据,t_book中number数量+1
在这里插入图片描述
书号查询和书名查询 在图书管理页面有
刷新

        public void Fresh()
        {
    
    
            dataGridView1.Rows.Clear();//清空旧数据
            Dao dao = new Dao();
            string sql = "select * from t_book";
            IDataReader dc = dao.read(sql);
            string a0, a1, a2, a3, a4, a5;
            //dc.Read():一行一行的读 读到没有了就会返回一个false
            while (dc.Read())
            {
    
    
                //dataGridView1.Rows.Add(dc[0].ToString(), dc[1].ToString(), dc[2].ToString(), dc[3].ToString(), dc[4].ToString());
                //下面这样写和上面这样写 效果是一样的
                a0 = dc[0].ToString();
                a1 = dc[1].ToString();
                a2 = dc[2].ToString();
                a3 = dc[3].ToString();
                a4 = dc[4].ToString();
                string[] table = {
    
     a0, a1, a2, a3, a4 };
                dataGridView1.Rows.Add(table);
            }
            //关闭 System.Data.IDataReader 对象。
            dc.Close();
            //关闭数据库连接
            dao.Close();
        }

借出图书按钮

            string id = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();//获取书号
            string name = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();
            int number=int.Parse(dataGridView1.SelectedRows[0].Cells[4].Value.ToString());//库存
            if(number<1)
            {
    
    
                MessageBox.Show("库存不足");
            }
            else
            {
    
    
                string sql = $"insert into t_lend  ([uid],bid,name,[datetime]) values('{
      
      Data.UID}','{
      
      id}','{
      
      name}',getdate());update t_book set number=number-1 where id='{
      
      id}'";
                Dao dao = new Dao();
                if(dao.Execute(sql)>1)//因为sql里面包含了两条语句
                {
    
    
                    MessageBox.Show($"{
      
      Data.UName}借书成功");
                    Fresh();
                }

            }

借书情况及归还页面

实际操作的就是t_lend和t_book这两个页面,t_lend页面减少一行数据,t_book中number数量+1
在这里插入图片描述
归还

            string no = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
            string bookid = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();
            string sql = $"delete from t_lend where[no] = {
      
      no}; update t_book set number = number + 1 where id = '{
      
      bookid}'";
            Dao dao = new Dao();
            if(dao.Execute(sql)>1)
            {
    
    
                MessageBox.Show("归还成功");
                Fresh();
            }

刷新

        public void Fresh()
        {
    
    
            dataGridView1.Rows.Clear();//清空旧数据
            Dao dao = new Dao();
            string sql = $"select *from t_lend where [uid]='{
      
      Data.UID}'";
            IDataReader dc = dao.read(sql);
            string a0, a1, a2, a3, a4, a5;
            //dc.Read():一行一行的读 读到没有了就会返回一个false
            while (dc.Read())
            {
    
    
                //dataGridView1.Rows.Add(dc[0].ToString(), dc[1].ToString(), dc[2].ToString(), dc[3].ToString(), dc[4].ToString());
                //下面这样写和上面这样写 效果是一样的
                a0 = dc[0].ToString();
                a1 = dc[1].ToString();
                a2 = dc[2].ToString();
                a3 = dc[3].ToString();
                a4 = dc[4].ToString();
                string[] table = {
    
     a0, a2, a3, a4 };
                dataGridView1.Rows.Add(table);
            }
            //关闭 System.Data.IDataReader 对象。
            dc.Close();
            //关闭数据库连接
            dao.Close();
        }

参考资料

安装
非常好的视频
视频
SQL教程
源码
学习MySQL这一篇就够了

猜你喜欢

转载自blog.csdn.net/chengcao123/article/details/126213786