【C#项目】图书馆管理系统-WinForm+MySQL

news2024/11/23 0:41:42

文章目录

  • 前言
  • 一、业务梳理与需求分析
      • 1.功能描述
      • 2.实现步骤
      • 3.功能逻辑图
  • 二、数据库设计
      • 1.实体-关系(E-R图)概念模型设计
      • 2.数据表设计
  • 三、WinForm界面交互设计
      • 1、界面交互逻辑
      • 2、项目树
      • 3、主界面+登录界面
      • 4、 图书查询界面
      • 5、图书借阅界面
      • 6、图书插入界面
      • 7、图书更新/删除界面
  • 四、通用类设计
      • 1、与MySQL通讯模块(整个类模块中删除命名空间等,值保留这个类)
      • 2、数据库操作模块:
  • 五、系统代码实现与分析
      • 1、主界面代码:
      • 2、登录界面代码
      • 3、图书查询模块代码
      • 4、图书借阅代码
      • 5、图书插入代码
      • 6、图书更新/删除代码
  • 总结


前言

图书馆管理系统主要功能有普通用户(学生)借书、管理员管理图书。


一、业务梳理与需求分析

1.功能描述

  • 系统中的普通用户模块有以下功能:
    图书查询:根据输入的搜索条件进行查询,可以查找多项,也可以查找所有图书。
    图书借阅:提供图书借阅证号,可以进行图书借阅。
  • 系统中的管理员用户模块有以下功能:
    图书查询:查询图书信息。
    图书借阅:提供图书借阅证号,可以进行图书借阅。
    增加图书:增添新图书。
    修改图书:对图书信息进行修改。
    删除图书:删除过时的、不能借阅的图书。

2.实现步骤

  • 一个完整系统的数据库设计。
  • 图书馆管理系统的界面设计。
  • 项目的通用类。
  • 图书馆管理系统代码的实现和分析。

3.功能逻辑图

在这里插入图片描述

二、数据库设计

1.实体-关系(E-R图)概念模型设计

代码如下(示例):

2.数据表设计

根据需求分析进行数据库设计,数据库名称为BookManage,根据E-R图,有学生表、图书信息表、管理员表、借阅表。学生和管理员合并为一张用户表,增加一个字段用户权限进行区分。

  • 用户表结构

    在这里插入图片描述

在这里插入图片描述

  • 图书信息表结构
    在这里插入图片描述

在这里插入图片描述

  • 图书借阅信息表结构
    在这里插入图片描述

在这里插入图片描述

三、WinForm界面交互设计

1、界面交互逻辑

在这里插入图片描述

2、项目树

在这里插入图片描述

3、主界面+登录界面

在这里插入图片描述

4、 图书查询界面

在这里插入图片描述

5、图书借阅界面

在这里插入图片描述

6、图书插入界面

在这里插入图片描述

7、图书更新/删除界面

在这里插入图片描述

四、通用类设计

1、与MySQL通讯模块(整个类模块中删除命名空间等,值保留这个类)

public static class DBModule
{
    public static string ServerIP = "**.**.**.**";
    public static string ServerPort = "****";
    public static string ServerUser = "****";
    public static string ServerPassword = "****";
    public static string ServerDBName = "bookmanage";
}

2、数据库操作模块:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
using System.Data;

public class MySQLHelper
{
    private MySqlConnection myConnection;
    private string mErrorString;

    //构造函数
    public MySQLHelper(string strServerIP, string strServerPort, string strServerUser, string strPassword, string strDBName)
    {
        string strConnectionString = String.Format("server={0}; port={1}; user id={2}; password={3}; database={4}", 
            strServerIP, strServerPort, strServerUser, strPassword, strDBName);
        myConnection = new MySqlConnection(strConnectionString);
    }

    //测试连接
    public bool ConnectionTest()
    {
        bool result = false;
        try
        {
            if (myConnection.State == System.Data.ConnectionState.Closed)
            {
                myConnection.Close();
                result = true;
            }
        }
        catch (MySqlException ex)
        {
            mErrorString = ex.ToString();
        }
        return result;
    }

    /// <summary>
    /// 执行查询语句,用DataTable返回结果,调用前要传入DataTable的实例化对象作为参数
    /// </summary>
    /// <param name="strQuery">查询命令</param>
    /// <param name="dt">返回数据表</param>
    /// <returns></returns>
    public bool ExcuteQuerySql(string strQuery, ref DataTable dt)
    {
        if (dt == null)
        {
            mErrorString = "传入的DataTable为null";
            return false;
        }
        bool result = false;
        try
        {
            MySqlCommand myCommand = new MySqlCommand(strQuery);
            myCommand.Connection = myConnection;
            if (myConnection.State == ConnectionState.Closed)
            {
                myConnection.Open();
            }
            dt.Load(myCommand.ExecuteReader());
            result = true;
        }
        catch (MySqlException ex)
        {
            mErrorString = String.Format("ExcuteQuery {0} failed.", ex.ToString());
            return false;
        }
        finally
        {
            myConnection.Close();
        }
        return result;
    }

    /// <summary>
    /// 执行带参数的查询语句,使用前传入参数、DataTable实例化对象
    /// </summary>
    /// <param name="strQuery">查询语句</param>
    /// <param name="param"></param>
    /// <param name="dt"></param>
    /// <returns></returns>
    public bool ExcuteQuerySql(string strQuery, MySqlParameter[] param, ref DataTable dt)
    {
        if (dt == null)
        {
            mErrorString = "传入的DataTable为null.";
            return false;
        }
        bool result = false;
        try
        {
            MySqlCommand myCommand = new MySqlCommand(strQuery);
            myCommand.Connection = myConnection;
            if (myConnection.State == ConnectionState.Closed)
            {
                myConnection.Open();
            }
            for (int i = 0; i < param.Length; i++)
            {
                myCommand.Parameters.Add(param[i]);
            }
            dt.Load(myCommand.ExecuteReader());
            result = true;
        }
        catch (MySqlException ex)
        {
            mErrorString = String.Format("ExcuteQuery {0} failed", strQuery) + ex.Message;
            return false;
        }
        finally
        {
            myConnection.Close();
        }
        return result;
    }

    //执行非查询语句
    public int ExcuteSql(string SqlCmdText)
    {
        int row = -1;

        try
        {
            MySqlCommand myCommand = new MySqlCommand(SqlCmdText);
            myCommand.CommandText = SqlCmdText;
            myCommand.Connection = myConnection;
            if (myConnection.State == ConnectionState.Closed)
            {
                myConnection.Open();
            }
            row = myCommand.ExecuteNonQuery();
        }
        catch (MySqlException ex)
        {
            mErrorString = String.Format("ExcuteNonQuery {0} failed", SqlCmdText);
        }

        return row;
    }
    //执行非查询语句
    public int ExcuteSql(string[] SqlCmdText)
    {
        try
        {
            if (myConnection.State == ConnectionState.Closed)
            {
                myConnection.Open();
            }

            for (int i = 0; i < SqlCmdText.Length; i++)
            {
                MySqlCommand myCommand = new MySqlCommand(SqlCmdText[i]);
                myCommand.CommandText = SqlCmdText[i];
                myCommand.Connection = myConnection;
                myCommand.ExecuteNonQuery();
            }
        }
        catch (MySqlException ex)
        {
            mErrorString = String.Format("ExcuteNonQuery {0} failed", SqlCmdText) + ex.Message;
            return -1;
        }
        return -1;
    }

    //执行带参数的非查询语句
    public int ExcuteSql(string SqlCmdText, MySqlParameter[] param)
    {
        int row = -1;

        try
        {
            MySqlCommand myCommand = new MySqlCommand(SqlCmdText);
            myCommand.CommandText = SqlCmdText;
            myCommand.Connection = myConnection;
            if (myConnection.State == ConnectionState.Closed)
            {
                myConnection.Open();
            }
            for (int i = 0; i < param.Length; i++)
            {
                myCommand.Parameters.Add(param[i]);
            }
            row = myCommand.ExecuteNonQuery();
        }
        catch (MySqlException ex)
        {
            mErrorString = String.Format("ExecuteNonQuery {0} failed", SqlCmdText) + ex.Message;
            return row = -1;
        }
        return row;
    }

    public string GetErrInfo()
    {
        return mErrorString;
    }
}


五、系统代码实现与分析

1、主界面代码:

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;

namespace BookManage
{
    public partial class FrmMain : Form
    {
        public static DialogResult result;//声明对话框返回对象
        public FrmMain()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 查询子窗体是否存在
        /// </summary>
        /// <param name="childfrmname"></param>
        /// <returns></returns>
        public bool CheckChildFrm(string childfrmname)
        {
            foreach (Form childFrm in this.MdiChildren)//遍历子窗体
            {
                if (childFrm.Name == childfrmname)//如果子窗体存在
                {
                    if (childFrm.WindowState == FormWindowState.Minimized)
                    {
                        childFrm.WindowState = FormWindowState.Normal;
                    }
                    childFrm.Activate();//激活该窗体
                    return true;        //存在返回true
                }
            }
            return false;//不存在返回false
        }

        /// <summary>
        /// 用户登录菜单的事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void 用户登录ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //检测登录窗口是否打开
            if (this.CheckChildFrm("FrmLogin") == true)
            {
                return;//窗口已经打开,返回
            }
            FrmLogin user = new FrmLogin();//实例化登录窗体
            user.ShowDialog();//登录窗体以模式对话框的方式打开
            
            //判断是否登录成功,登录成功则启用相应的菜单和按钮
            if (result == System.Windows.Forms.DialogResult.OK && FrmLogin.ustate == 0)//普通用户
            {
                toolSBSearch.Enabled = true;
                toolSBBookBorown.Enabled = true;
            }
            else if (result == System.Windows.Forms.DialogResult.OK && FrmLogin.ustate == 1)//管理员
            {
                toolSBSearch.Enabled = true;
                toolSBBookBorown.Enabled = true;

                toolMBookManage.Enabled = true;
            }
        }

        /// <summary>
        /// 用户登录按钮事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void toolSBLogin_Click(object sender, EventArgs e)
        {
            //检测登录窗口是否打开
            if (this.CheckChildFrm("FrmLogin") == true)
            {
                return;//窗口已经打开,返回
            }
            FrmLogin user = new FrmLogin();//实例化登录窗体
            user.ShowDialog();//登录窗体以模式对话框的方式打开

            //判断是否登录成功,登录成功则启用相应的菜单和按钮
            if (result == System.Windows.Forms.DialogResult.OK && FrmLogin.ustate == 0)//普通用户
            {
                //普通用户登录后使能按钮
                toolSBSearch.Enabled = true;
                toolSBBookBorown.Enabled = true;
            }
            else if (result == System.Windows.Forms.DialogResult.OK && FrmLogin.ustate == 1)//管理员
            {
                //管理员登录后使能按钮
                toolSBSearch.Enabled = true;
                toolSBBookBorown.Enabled = true;

                toolMBookManage.Enabled = true;
            }
        }

        /// <summary>
        /// 图书查询按钮,转到图书查询界面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void toolSBSearch_Click(object sender, EventArgs e)
        {
            if (this.CheckChildFrm("FrmBookSearch") == true)
            {
                return;
            }
            FrmBookSearch frmBookSearch = new FrmBookSearch();
            frmBookSearch.MdiParent = this;//设置当前窗体的子窗体为frmBookSearch
            frmBookSearch.Show();
        }

        /// <summary>
        /// 图书借阅按钮,转到图书借阅界面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void toolSBBookBorown_Click(object sender, EventArgs e)
        {
            if (this.CheckChildFrm("FrmBookBrown") == true)
            {
                return;
            }
            FrmBookBrown frmBookBrown = new FrmBookBrown();
            frmBookBrown.MdiParent = this;//设置当前窗体的子窗体为frmBookBrown
            frmBookBrown.Show();
        }

        /// <summary>
        /// 图书插入按钮,转到图书插入界面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void toolMBookIn_Click(object sender, EventArgs e)
        {
            if (this.CheckChildFrm("FrmBookIn") == true)
            {
                return;
            }
            FrmBookIn frmBookIn = new FrmBookIn();
            frmBookIn.MdiParent = this;//设置当前窗体的子窗体为frmBookIn
            frmBookIn.Show();
        }

        /// <summary>
        /// 图书更新/删除按钮,转到图书更新与删除界面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void toolMBookUpdate_Click(object sender, EventArgs e)
        {
            if (this.CheckChildFrm("FrmUpdateBook") == true)
            {
                return;
            }
            FrmUpdateBook frmUpdateBook = new FrmUpdateBook();
            frmUpdateBook.MdiParent = this;//设置当前窗体的子窗体为frmUpdateBook
            frmUpdateBook.Show();
        }

        private void toolSBExit_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("确认退出程序?", "确认信息", MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.OK)
            {
                System.Environment.Exit(0);
            }
        }



    }
}

2、登录界面代码

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;

namespace BookManage
{
    public partial class FrmLogin : Form
    {
        public FrmLogin()
        {
            InitializeComponent();
        }

        public static int ustate;//普通用户or管理员标志

        FrmMain femmain = new FrmMain();
        private void btnLogin_Click(object sender, EventArgs e)
        {
            //输入合法性判断
            if (Volidity())//合法性通过
            {
                string state = this.cmbUserType.Text;
                int num;
                if (state.Equals("管理员"))//判断用户角色
                {
                    num = 1;
                }
                else
                {
                    num = 2;
                }
                //定义查询语句
                string sql = String.Format("select * from user where uname='{0}' and upwd='{1}' and ustate='{2}'", 
                this.txtUserName.Text.Trim(), this.txtPwd.Text.Trim(), num);

                MySQLHelper sqlHelper = new MySQLHelper(DBModule.ServerIP, DBModule.ServerPort, DBModule.ServerUser, DBModule.ServerPassword, DBModule.ServerDBName);

             
                DataTable dt = new DataTable();
                

                bool queryFlag = sqlHelper.ExcuteQuerySql(sql, ref dt);
                if (queryFlag == false)
                {
                    MessageBox.Show("登录失败,没有找到该用户");
                }
                if (dt.Rows.Count > 0)
                {
                    MessageBox.Show("登录成功!");
                    FrmMain.result = DialogResult.OK;//为变量result赋值
                    DBModule.UserName = txtUserName.Text;
                    this.Close();
                }
                else
                {
                    MessageBox.Show("用户名或密码错误,请重新输入");
                }
            }
        }

        /// <summary>
        /// 验证合法性
        /// </summary>
        private bool Volidity()
        {
            if (this.txtPwd.Text != string.Empty && this.txtPwd.Text != string.Empty)
            {
                return true;
            }
            else
            {
                MessageBox.Show("用户名或密码不能为空");
            }
            return false;
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void cmbUserType_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbUserType.SelectedIndex == 0)
            {
                cmbUserType.Text = "普通用户";
                ustate = 0;
            }
            else
            {
                cmbUserType.Text = "管理员";
                ustate = 1;
            }
        }

        private void FromLogin_Load(object sender, EventArgs e)
        {
            this.cmbUserType.SelectedIndex = 0;
            ustate = 0;
        }
    }
}

3、图书查询模块代码

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;

namespace BookManage
{
    public partial class FrmBookSearch : Form
    {
        public FrmBookSearch()
        {
            InitializeComponent();
        }

        private void btnSearch_Click(object sender, EventArgs e)
        {
            string strBookType = cmbBokTyp.Text;
            string strBookTypeOr = cmbBokTypOr.Text;
            string strBookName = txtBokNm.Text;
            string strBookNameOr = txtBokNmOr.Text;
            string strBookConment = txtBokCotnt.Text;

            //定义sql语句
            string sql = "SELECT * FROM book WHERE booktype='" + strBookType + "'" + "or booktype='" + strBookTypeOr + "'" + 
                " and bookname='" + strBookName + "';";

            MySQLHelper sqlHelper = new MySQLHelper(DBModule.ServerIP, DBModule.ServerPort, DBModule.ServerUser, DBModule.ServerPassword, DBModule.ServerDBName);

            DataTable dt = new DataTable();

            bool queryFlag = sqlHelper.ExcuteQuerySql(sql, ref dt);

            if (queryFlag == false)
            {
                MessageBox.Show("查询失败,没有该图书信息");
            }

            if (dt.Rows.Count > 0)
            {
                dgvBookSearch.DataSource = dt;
            }

            //设置列名标题
            string[] strColumnName = { "图书ID", "图书类别", "书名", "作者", "价格", "封面", "内容简介", "指定访问码"};
            for (int i = 0; i < dgvBookSearch.Columns.Count; i++)
			{
                dgvBookSearch.Columns[i].HeaderText = strColumnName[i];
			}
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void FrmBookSearch_Load(object sender, EventArgs e)
        {
            //图书类别的初始化
            string sql = "SELECT DISTINCT booktype FROM book;";

            MySQLHelper sqlHelper = new MySQLHelper(DBModule.ServerIP, DBModule.ServerPort, DBModule.ServerUser, DBModule.ServerPassword, DBModule.ServerDBName);

            DataTable dtTtpe = new DataTable();
            try
            {
                bool queryFlag = sqlHelper.ExcuteQuerySql(sql, ref dtTtpe);

                if (queryFlag == false)
                {
                    MessageBox.Show("查询图书类型失败");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("查询图书类型失败" + ex.ToString());
            }

            if (dtTtpe.Rows.Count > 0)
            {
                for (int i = 0; i < dtTtpe.Rows.Count; i++)
                {
                    this.cmbBokTyp.Items.Add(dtTtpe.Rows[i][0].ToString());
                    this.cmbBokTypOr.Items.Add(dtTtpe.Rows[i][0].ToString());
                }
            }

            this.cmbBokTyp.SelectedIndex = 0;
            this.cmbBokTypOr.SelectedIndex = 0;
        }
    }
}

4、图书借阅代码

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;

namespace BookManage
{
    public partial class FrmBookBrown : Form
    {
        public FrmBookBrown()
        {
            InitializeComponent();
        }

        DataTable dt = new DataTable();

        MySQLHelper sqlHelper = new MySQLHelper(DBModule.ServerIP, DBModule.ServerPort, DBModule.ServerUser, DBModule.ServerPassword, DBModule.ServerDBName);


        /// <summary>
        /// 图书借阅按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnBrown_Click(object sender, EventArgs e)
        {
            //获取下拉框中选中图书的ID
            int bookid = Convert.ToInt32(this.cmbBookName.SelectedIndex + 1);

            //获取用户的借阅证
            int issid = Convert.ToInt32(this.txtIssueID.Text);

            //获取借阅时间
            DateTime date = Convert.ToDateTime(this.IssDatetime.Text);

            //更新借阅信息
            string sql = "insert into bookbrown (bookid, issbookid, issdatetime) values ('" + bookid + "', '" + issid + "', '" + date + "');";

            //借阅信息中没有这本书才可借阅
            DataTable dtC = new DataTable();
            sqlHelper.ExcuteQuerySql("select bookid from bookbrown;", ref dtC);

            int flagTmp = 0;
            for (int i = 0; i < dtC.Rows.Count; i++)
            {
                if (Convert.ToInt32(dtC.Rows[i][0].ToString()) == bookid)
                {
                    flagTmp = 1;
                }
            }

            if (flagTmp == 1)
            {
                MessageBox.Show("这本书你已经借阅过,借阅不能超过1本", "提示信息", MessageBoxButtons.OK);
            }
            else
            {
                if (sqlHelper.ExcuteSql(sql) == 1)
                {
                    MessageBox.Show("借阅成功");
                }
                else
                {
                    MessageBox.Show("借阅失败");
                }
            }
            
            //刷新借阅证中的图书信息
            string sqlQ = "select bookinfo.bookid,bookname,issbookid,issdatetime from bookbrown,bookinfo where bookinfo.bookid=bookbrown.bookid;";
           
            bool queryFlagQ = sqlHelper.ExcuteQuerySql(sqlQ, ref dt);

            if (queryFlagQ == true)
            {
                this.dataGridView1.DataSource = dt;
            }
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void FrmBookBrown_Load(object sender, EventArgs e)
        {
            string sql = "select * from bookinfo;";
            //联合图书信息表、借阅信息表查询
            string sqlBro = "select bookinfo.bookid,bookname,issbookid,issdatetime from bookbrown,bookinfo where bookinfo.bookid=bookbrown.bookid;"; //主键与外键的关联

            try
            {
                bool queryFlag = sqlHelper.ExcuteQuerySql(sql, ref dt);//查询图书信息

                if (queryFlag == false)
                {
                    MessageBox.Show("查询失败");
                }
                else
                {
                    //自动加载图书名到下拉框
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        this.cmbBookName.Items.Add(dt.Rows[i][1].ToString());
                    }
                }


               //联合查询查询本人借阅信息
                DataTable dtBro=new DataTable();
                bool queryFlagBro = sqlHelper.ExcuteQuerySql(sqlBro, ref dtBro);

                if (queryFlagBro == true)
                {
                    this.dataGridView1.DataSource = dtBro;
                }
                else
                {
                    MessageBox.Show("查询借阅信息失败");
                }

                //查询用户信息 
                string sqlU = "select * from user where uname= '" + DBModule.UserName + "';";

                DataTable dtU = new DataTable();

                bool queryFlagU = sqlHelper.ExcuteQuerySql(sqlU, ref dtU);

                if (queryFlagU == true)
                {
                    this.txtUserName.Text = dtU.Rows[0]["uname"].ToString();
                    this.txtIssueID.Text = dtU.Rows[0]["upwd"].ToString();
                }
                
                //初始化列名
                string[] strColumnName = { "图书编号", "图书名称", "指定访问码", "借阅时间"};
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    dataGridView1.Columns[i].HeaderText=strColumnName[i];
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(""); 
            }
            
        }

        /// <summary>
        /// 图书名称选项变化的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cmbBookName_SelectedIndexChanged(object sender, EventArgs e)
        {
            //遍历图书信息表,查询和选中书名相同的信息,加载到界面
            foreach (DataRow row in dt.Rows)
            {
                if (cmbBookName.Text == row["bookname"].ToString())
                {
                    this.txtBookIssue.Text = row["bookissue"].ToString();
                    this.txtBookAuthor.Text = row["bookauthor"].ToString();
                }
            }
        }

    }
}

5、图书插入代码

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;

namespace BookManage
{
    public partial class FrmBookIn : Form
    {
        public FrmBookIn()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 图书插入按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnInsert_Click(object sender, EventArgs e)
        {
            //定义变量接收控件的值
            string strBookType = txtBookType.Text;
            string strBookName = txtBookName.Text;
            string strAuthor = txtAuthor.Text;
            string strPrice = txtPrice.Text;
            string strPic = txtPic.Text;
            string strContent = txtContent.Text;
            string strIssue = txtIssue.Text;

            if (Vaildate())
            {
                //sql语句
                string sql = "insert into bookinfo (bookname, booktype, bookauthor, bookprice, bookpic, bookcontent, bookissue)"
                    + " values ('" + strBookName + "', '" + strBookType + "', '" + strAuthor + "', '" + strPrice + "', '" + 
                    strPic + "', '" + strContent + "', '" + strIssue + "');";

                MySQLHelper sqlHelper = new MySQLHelper(DBModule.ServerIP, DBModule.ServerPort, DBModule.ServerUser, DBModule.ServerPassword, DBModule.ServerDBName);
                
                int result=sqlHelper.ExcuteSql(sql);

                if (result == 1)
                {
                    MessageBox.Show("添加成功", "提示", MessageBoxButtons.OK);
                }
                else
                {
                    MessageBox.Show("添加失败", "提示", MessageBoxButtons.OK);
                }

                DataTable dt = new DataTable();
                sqlHelper.ExcuteQuerySql("select * from bookinfo;", ref dt);

                this.dataGridView1.DataSource = dt;

                //设置列名标题
                string[] strColumnName = { "图书ID", "图书类别", "书名", "作者", "价格", "封面", "内容简介", "指定访问码" };
                for (int i = 0; i < dataGridView1.Columns.Count; i++)
                {
                    dataGridView1.Columns[i].HeaderText = strColumnName[i];
                }
            }
        }

        /// <summary>
        /// 退出图书界面按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// 输入合法性验证
        /// </summary>
        /// <returns></returns>
        private bool Vaildate()
        {
            if (txtBookType.Text != string.Empty && txtBookName.Text != string.Empty && txtAuthor.Text != string.Empty
                && txtPrice.Text != string.Empty && txtPic.Text != string.Empty && txtContent.Text != string.Empty && txtIssue.Text != string.Empty)
            {
                return true;
            }
            else
            {
                MessageBox.Show("请出入完整信息");
            }
            return false;
        }

    }
}

6、图书更新/删除代码

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;

namespace BookManage
{
    public partial class FrmUpdateBook : Form
    {
        public FrmUpdateBook()
        {
            InitializeComponent();
        }

        MySQLHelper sqlHelper = new MySQLHelper(DBModule.ServerIP, DBModule.ServerPort, DBModule.ServerUser, DBModule.ServerPassword, DBModule.ServerDBName);

        /// <summary>
        /// 保存信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSave_Click(object sender, EventArgs e)
        {
            string sql = "select * from bookinfo;";

            DataTable dt = new DataTable();

            if (MessageBox.Show("确实要将修改保存到数据库?", "提示信息", MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.OK)
            {
                bool queryFlag = sqlHelper.ExcuteQuerySql(sql, ref dt);

                if (queryFlag == true)
                {
                    MessageBox.Show("保存成功");
                }
                this.dataGridView1.DataSource = dt;
            }

            //设置列名标题
            string[] strColumnName = { "图书ID", "图书类别", "书名", "作者", "价格", "封面", "内容简介", "指定访问码" };
            for (int i = 0; i < dataGridView1.Columns.Count; i++)
            {
                dataGridView1.Columns[i].HeaderText = strColumnName[i];
            }
        }

        /// <summary>
        /// 更新信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnUpdate_Click(object sender, EventArgs e)
        {
            string strBookType = txtBookType.Text;
            string strBookName = txtBookName.Text;
            string strBookAuthor = txtBookAuthor.Text;
            string strBookPrice = txtBookPrice.Text;
            string strBookPic = txtBookPic.Text;
            string strBookContent = txtBookContent.Text;
            string strBookIssue = txtBookIssue.Text;

            if (true)
            {
                string sql = string.Format("update bookinfo set booktype='{0}', bookname='{1}', bookauthor='{2}', bookprice='{3}', bookpic='{4}', bookcontent='{5}',bookissue='{6}' where bookid={7};",
                 strBookType, strBookName, strBookAuthor, strBookPrice, strBookPic, strBookContent, strBookIssue, Convert.ToInt32(txtBookID.Text));

                if (sqlHelper.ExcuteSql(sql) == 1)
                {
                    MessageBox.Show("更新成功", "提示信息", MessageBoxButtons.OK);
                }
                else
                {
                    MessageBox.Show("更新失败", "提示信息", MessageBoxButtons.OK);
                }
            }
        }

        /// <summary>
        /// 删除信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDelete_Click(object sender, EventArgs e)
        {
            if (this.txtBookID.Text != string.Empty)
            {
                string sql = "select * from bookbrown where bookid=" + Convert.ToInt32(txtBookID.Text) + "";

                DataTable dt = new DataTable();

                bool queryFlag = sqlHelper.ExcuteQuerySql(sql, ref dt);

                if (queryFlag == true && dt.Rows.Count > 0)
                {
                    MessageBox.Show("此书有借阅,不能删除");
                }
                else
                {
                    string sqlDe = "delete from bookinfo where bookid=" + this.txtBookID.Text + "";

                    if (sqlHelper.ExcuteSql(sqlDe) == 1)
                    {
                        MessageBox.Show("删除成功", "提示信息", MessageBoxButtons.OK);
                    }
                    else
                    {
                        MessageBox.Show("删除失败", "提示信息", MessageBoxButtons.OK);
                    }
                }
            }
        }

        /// <summary>
        /// 取消
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCancel_Click(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// 验证输入合法性
        /// </summary>
        /// <returns></returns>
        private bool Vaildate()
        {
            if (txtBookType.Text != string.Empty && txtBookName.Text != string.Empty && txtBookAuthor.Text != string.Empty
                && txtBookPrice.Text != string.Empty && txtBookPic.Text != string.Empty
                && txtBookContent.Text != string.Empty && txtBookIssue.Text != string.Empty && txtBookID.Text != string.Empty)
            {
                return true;
            }
            else
            {
                MessageBox.Show("请出入完整信息");
            }
            return false;
        }

    }
}
    




总结

本项目实现一个简单的图书馆管理系统,是一个完整的图书馆管理系统的简化版。通过这个项目,了解整个桌面应用软件的规范化开发流程,业务梳理、需求分析、概要设计、详细设计、数据库设计、界面交互设计、详细代码设计等步骤。同时将代码开发规范融入其中,尽量使用较为规范的代码。加深了对WinForm界面控件的认识,对MySQL更加熟悉。数据库SQL语言操作还需要多联系,纸上得来终觉浅,觉知此事要躬行。SQL语句看似简单,实际操作起来是出问题最多的地方。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/337508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pixhawk2.4.8-地面站配置-APM固件

目录一、硬件准备二、APM固件、MP地面站下载三、地面站配置1 刷固件2 机架选择3 加速度计校准4 指南针校准5 遥控器校准6 飞行模式7 紧急断电&无头模式8 基础参数设置9 电流计校准10 电调校准11 起飞前检查&#xff08;每一项都非常重要&#xff09;12 飞行经验四、遇到的问…

10.数据库恢复技术

其他章节here 梳理 名词解释 事务&#xff1a;事务是用户定义的 一个数据操作序列&#xff0c;这些操作要么全做&#xff0c;要么全不做&#xff0c;是一个不可分割的工作单位 事务≠程序 事务是恢复和并发控制的基本单位 &#xff08;事务时数据库应用程序的基本逻辑单元&am…

制造业升级转型:制造业上市公司-智能制造词频统计数据集

发展智能制造&#xff0c;关乎中国制造业转型升级的成效。基于中国制造业上市公司年报&#xff0c;通过文本数据挖掘&#xff0c;提取关键词反映企业对智能制造的关切焦点&#xff0c;进而运用词频及共词网络分析&#xff0c;洞察中国智能制造的发展态势。 研究发现&#xff0…

OpenAI最重要的模型【CLIP】

最近的 AI 突破 DALLE和 Stable Diffusion有什么共同点&#xff1f; 它们都使用 CLIP 架构的组件。 因此&#xff0c;如果你想掌握这些模型是如何工作的&#xff0c;了解 CLIP 是先决条件。 此外&#xff0c;CLIP 已被用于在 Unsplash 上索引照片。 但是 CLIP 做了什么&…

若依框架---为什么把添加和更新分成两个接口

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…

SpringCloud-Netflix学习笔记11——Hystrix实现服务降级

服务降级 是什么&#xff1f; 整体资源快不够了&#xff0c;忍痛将某些服务先关掉&#xff0c;待渡过难关&#xff0c;再开启回来。 如下图&#xff0c;在某一个时间段&#xff0c;访问服务A的请求特别多&#xff0c;而访问服务B和服务C的请求特别少&#xff0c;这时我们可以把…

实战打靶集锦-004-My-Cmsms

**写在前面&#xff1a;**记录一次艰难曲折的打靶经历。 目录1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 WEB服务探查4.1.1 浏览器访问4.1.2 目录枚举4.1.3 控制台探查4.1.4 其他目录探查4.2 阶段小结5. 公共EXP搜索5.1 CMS搜索5.2 Apache搜索5.3 PHP搜索5.4 MySQL搜索5…

DaVinci:色度 - 亮度网格

调色页面&#xff1a;色彩扭曲器 Color&#xff1a;Color Warper相对于色相 - 饱和度网格&#xff0c;色度 - 亮度 Chroma - Luma网格在颜色的亮度控制上更加灵活。◆ ◆ ◆工作原理分析色度 - 亮度网格来自色彩空间三维模型中圆柱体垂直切分的两个 90 交叉的纵向平面。网格上…

介绍架构分类、设计及架构师工作

title: 介绍架构分类、设计及架构师工作 date: 2019-06-07 13:49:00 tags: 架构分类架构设计功能设计架构师 categories:架构 介绍 本文从理论上分析、梳理架构相关知识&#xff0c;帮助自己更好的理解架构工作。 什么是架构和架构分类 什么是架构 关于架构的定义业界有太多…

致敬白衣天使,学习Python读取

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、c 主页&#xff1a;阿玥的小东东 故事设定&#xff1a;现在学校要求对所有同学进行核酸采集&#xff0c;每位同学先在宿舍内等候防护人员&#xff08;以下简称“大白”&#xff09;叫号&#xff0c;叫到自己时去停车场排…

JDK 8 JVM内存结构详解

前言 本文所介绍的是 JDK 1.8 版本&#xff0c;其他版本的 JDK 在这里并不一定正确&#xff1b;内容主要摘自周志明的《深入理解Java虚拟机》一书的关键点&#xff0c;并根据自身的理解进行记录。感兴趣的同学可以去阅读原著。 JVM 的内存结构&#xff0c;主要包括以下 5 个区…

Jupyter 插件配置和主题设置

Jupyter 插件配置和主题设置 前提需要暗转Anaconda 或者系统已有Jupyter。 即使想在conda 虚拟环境中使用Jupyter 也不用在虚拟环境中重新安装和配置Jupyter相关包。 在base环境中&#xff0c;下载插件管理包&#xff1a; pip install jupyter_contrib_nbextensions -i htt…

开源项目 —— 原生JS实现斗地主游戏 ——代码极少、功能都有、直接粘贴即用

目录 效果如下 目录结构 GameEntity.js GrawGame.js konva.min.js PlayGame.js veriable.js index.html 结语&#xff1a; 前期回顾 卡通形象人物2 写代码-睡觉 丝滑如德芙_0.活在风浪里的博客-CSDN博客本文实现了包含形象的卡通小人吃、睡、电脑工作的网页动画https://…

【Pytorch项目实战】之语义分割:U-Net、UNet++、U2Net

文章目录博主精品专栏导航一、前言1.1、什么是图像分割&#xff1f;1.2、语义分割与实例分割的区别1.3、语义分割的上下文信息1.4、语义分割的网络架构二、网络 数据集2.1、经典网络的发展史&#xff08;模型详解&#xff09;2.2、分割数据集下载三、算法详解3.1、U-Net3.1.1、…

oceanbase部署--使用OBD自动化部署三节点集群

准备步骤&#xff1a; 先将192.168.152.30 现有单节点集群stop&#xff0c;然后克隆两台虚拟机并在workstations重置网卡MAC&#xff0c;配置新主机IP [adminoceanbase ~]$ obd cluster list ---------------------------------------------------------------------- | …

【C语言学习笔记】:函数和对象

一、本篇要学习的内容和知识结构概览 二、知识点逐条分析 1. 混合型语言 C源文件的文件扩展名为.cpp, 也就是c plus plus的简写, 在该文件里有且只能有一个名为main的主函数, 它作为程序的入口. 因为这个主函数的存在, 所以C被称为混合型语言. 2. C语言当中的注释 第一种: …

[单片机框架][调试功能] 回溯案发现场

程序莫名死机跑飞&#xff0c;不知道问题&#xff0c;那么下面教你回溯错误源 回溯案发现场一、修改HardFault_Handler1. xx.s 在启动文件&#xff0c;找到HardFault_Handler。并修改。2. 定义HardFault_Handler_C函数。&#xff08;主要是打印信息并存储Flash&#xff09;3. 根…

javascript测试题

一、填空题 1. JavaScript 有两种引用数据类型 &#xff1a;___数组__、_____对象_ __。2. Javascript 通过___setTimeout______延迟指定时间后&#xff0c;去执行某程序。 3. Javascript 里 String 对象通过____indexOf____方法取第一次出现子字符 串的字符位置。4. Javascrip…

动态规划-背包问题

文章目录一、背包问题1. 背包问题简介2. 背包问题解决方法二、01 背包问题1. 实现思路2. 实现代码三、完全背包问题1. 实现思路2. 实现代码四、多重背包问题&#xff08;一&#xff09;1. 实现思路2. 实现代码五、多重背包问题&#xff08;二&#xff09;1. 实现思路2. 实现代码…

【C++之容器篇】精华:vector常见函数的接口的熟悉与使用

目录前言一、认识vector1. 介绍2. 成员类型二、默认成员函数&#xff08;Member functions&#xff09;1. 构造函数2. 拷贝构造函数vector (const vector& x);3. 析构函数4. 赋值运算符重载函数三、迭代器&#xff08;Iterators&#xff09;1. 普通对象的迭代器2. const对象…