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


前言

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


一、业务梳理与需求分析

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语句看似简单,实际操作起来是出问题最多的地方。

  • 24
    点赞
  • 203
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: WinForm是一种在Windows操作系统上开发桌面应用程序的技术框架,它基于.NET框架,使用C#编程语言。WinForm中文文档是针对中国开发者提供的WinForm框架相关的文档和教程,以中文语言编写的技术资料。 WinForm中文文档包括了WinForm框架的概述、使用方法、常用控件的介绍和使用示例、事件处理、数据绑定、图形界面设计等方面的内容。它提供了标准化的编程接口和类库,帮助开发者更快地开发出功能完善、交互友好的桌面应用程序。 在WinForm中文文档中,可以学习如何使用各种控件,如按钮、文本框、列表框、下拉框等,来构建用户界面。还可以学习如何通过事件处理来响应用户的操作,以及如何进行数据的绑定,实现界面与数据的交互。同时,WinForm中文文档也会介绍如何使用图形界面设计器来进行可视化设计,方便开发者进行界面布局和样式设计。 通过阅读WinForm中文文档,开发者可以快速掌握WinForm框架的使用方法,了解如何使用C#语言进行桌面应用程序的开发。中文文档的编写可以帮助中国开发者更好地理解和使用WinForm框架,并提供了一种便捷的学习途径。无论是初学者还是有经验的开发者,都可以从WinForm中文文档中获取所需的开发知识和技术支持。 ### 回答2: WinForm 是 Microsoft .NET Framework 提供的一种桌面应用程序开发框架,使用 C# 编写,可以在 Windows 操作系统上构建各种功能丰富的用户界面。 WinForm 中文文档可以为使用者提供全面详尽的开发指南与技术文档。中文文档可以帮助开发者更好地理解 WinForm 框架的基本概念、设计原则和开发流程。 首先,中文文档可以介绍 WinForm 的基本概念,包括窗体、控件、事件等等。通过明确这些基本概念,开发者可以更好地了解 WinForm 的工作原理和开发模式。 其次,中文文档可以详细介绍各种常用的 WinForm 控件,如按钮、文本框、列表框等等。文档可以介绍每种控件的属性、方法和事件,并给出实际使用示例,帮助开发者快速掌握控件的使用方法。 此外,中文文档还可以介绍如何进行窗体的布局、界面的美化、数据的绑定等高级功能。开发者可以了解这些高级功能的实现原理和具体步骤,使应用程序更加灵活和易于维护。 另外,中文文档还可以提供 WinForm 开发中的常见问题解答和调试技巧。开发者可以通过文档查找遇到的问题的解决方案,加快开发进度。 总之,WinForm 中文文档是开发者学习和使用 WinForm 框架的重要参考资料。它可以帮助开发者迅速入门,掌握框架的基本概念和使用技巧,提高开发效率,更好地构建功能强大且用户友好的桌面应用程序。 ### 回答3: WinForm是一个用于创建Windows应用程序的GUI框架。它是微软公司在.NET平台上推出的一种应用程序开发技术,提供了丰富的控件和功能,方便开发人员快速开发出具有良好用户界面的Windows应用程序。 WinForm中文文档是指针对WinForm框架的使用和开发进行详细说明的文档。这些文档通常由开发人员或技术团队编写,旨在帮助开发人员理解和掌握WinForm的各种功能和方法。 WinForm中文文档中通常包含了WinForm框架的介绍、环境搭建、控件使用、事件处理、数据绑定、布局管理等内容。在文档中,开发人员可以学习到如何创建窗体、添加控件、设置属性、处理事件等基础知识,以及如何进行布局管理、数据绑定、菜单栏、工具栏等高级功能的开发。 WinForm中文文档的编写需要结合实际案例和代码示例,以便开发人员能够更好地理解和实践。文档中通常会提供大量的示例代码和详细的解释,帮助开发人员一步步完成一个功能的实现。 拥有WinForm中文文档可以帮助开发人员更快速地上手WinForm框架,减少开发过程中的困惑和问题,提高开发效率。同时,文档还可以作为日后开发过程中的参考手册,方便查找和回顾相关知识。 总之,WinForm中文文档是一种帮助开发人员学习和掌握WinForm框架的重要资源,对于开发Windows应用程序具有重要作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值