图书馆管理系统开发(C# && Sql Server)

图书馆管理系统(C/S架构软件)开发

主要步骤

遇见问题

1 主要步骤

1.1 学习主干知识

  • 大概懂得数据库相关sql语法
  • 大概懂得C#语法(C#菜鸟教程)把基础篇看看
  • 大概掌握.Net开发窗口界面(.Net教程)然后可以实战一下项目(VS2022创建窗口界面教程
  • 大概理解三层架构
  • 进入实战进一步理解所学知识

1.2 实战

1.2.1 建立三层架构

在资源管理器里的解决方案添加几个C#类库项目分别对应Model层、DAL层、BLL层。
然后建立项目间的依赖关系。DAL层、UI层、BLL层都引用Model层。BLL层再引用DAL层,UI层再引用BLL层。

1.2.2 创建数据库

根据需求建立对应的数据库、表、视图等。具体数据库设计可以看设计文档。

1.2.3 Model(实体层搭建)

主要就是加入几个属性,例如用户的ID,Name,Password,Type。

namespace Model
{
    public class Mod_UserInfo
    {
        public Mod_UserInfo()
        {
            UserID = "";
            UserName = "";
            UserPWD = "";
            UserType = "reader";
        }
        public string UserID { get; set; }
        public string UserName { get; set; }
        public string UserPWD { get; set; }
        public string UserType { get; set; }
    }
}
1.2.4 DAL层搭建

创建增、删、改、查等简单方法,这个分为两步

  • 建立与数据库的底层连接(这些方法一般直接用现成的例如sqlhelp类等)
    其中比较常调用的是ExecuteNonQuery、ExecuteDataset这两个函数他们的底层也不用深究传几个参数就行。使用方法主要看函数上面的注释。ExecuteNonQuery这个函数主要执行一些不用返回什么值的操作,而ExecuteDataset主要执行一些查询操作可以返回信息列表等。
  • 建立自己相应的执行函数。
public class UserInfo
{
    //新建用户
    public void UserAdd(Model.Mod_UserInfo mod_userInfo)
    {
        //sql执行语句
        string sqlStr = "insert into tUser(userID, userName, userPWD, userType)" +
            "values(@id, @name, @pwd, @type)";
        
        //语句中的参数设置
        SqlParameter[] param = new SqlParameter[]
        {
            new SqlParameter("@id", mod_userInfo.UserID),
            new SqlParameter("@name", mod_userInfo.UserName),
            new SqlParameter("@pwd", mod_userInfo.UserPWD),
            new SqlParameter("@type", mod_userInfo.UserType)
        };

        //执行sql语句
        SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, System.Data.CommandType.Text, sqlStr, param);
    }

    //列出所有用户
    public List<Model.Mod_UserInfo> UserList()
    {
        string sqlStr = "select * from tUser";

        //获取数据集
        DataSet dataset = new DataSet();
        dataset = SqlHelper.ExecuteDataset(SqlHelper.connectionString, System.Data.CommandType.Text, sqlStr);
        
        //定义实体类列队
        List<Model.Mod_UserInfo> userInfos = new List<Model.Mod_UserInfo>();
        
        //将数据集中的数据按行读取输入到实体类列队中
        foreach (DataRow row in dataset.Tables[0].Rows)
        {
            Model.Mod_UserInfo mod_userInfo = new Model.Mod_UserInfo();
            mod_userInfo.UserID = row["userID"].ToString();
            mod_userInfo.UserName = row["userName"].ToString();
            mod_userInfo.UserPWD = row["userPWD"].ToString();
            mod_userInfo.UserType = row["userType"].ToString();
            userInfos.Add(mod_userInfo);
        }

        return userInfos;
    }
    //查询用户
    public Model.Mod_UserInfo UserSearch(string userID)
    {
        string sqlStr = "select * from tUser where userID = @id";

        //设置参数并执行
        DataSet dataset = new DataSet();
        dataset = SqlHelper.ExecuteDataset(SqlHelper.connectionString,
        System.Data.CommandType.Text, sqlStr, new SqlParameter("@id", userID));

        //将获取数据赋给单个实体
        Model.Mod_UserInfo mod_userInfo = new Model.Mod_UserInfo();
        DataRow row = dataset.Tables[0].Rows[0];
        mod_userInfo.UserID = row["userID"].ToString();
        mod_userInfo.UserName = row["userName"].ToString();
        mod_userInfo.UserPWD = row["userPWD"].ToString();
        mod_userInfo.UserType = row["userType"].ToString();

        return mod_userInfo;
    }

    //更新用户
    public void UserUpdate(Model.Mod_UserInfo mod_userInfo)
    {
        string sqlStrSetName = "update tUser set userName = @name where userID = @id";
        string sqlStrSetPWD = "update tUser set userPWD = @pwd where userID = @id";
        string sqlStrSetType = "update tUser set userType = @type where userID = @id";
        
        SqlParameter[] param = new SqlParameter[]
        {
            new SqlParameter("@id", mod_userInfo.UserID),
            new SqlParameter("@name", mod_userInfo.UserName),
            new SqlParameter("@pwd", mod_userInfo.UserPWD),
            new SqlParameter("@type", mod_userInfo.UserType)
        };

        SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, System.Data.CommandType.Text, sqlStrSetName, param);
        SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, System.Data.CommandType.Text, sqlStrSetPWD, param);
        SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, System.Data.CommandType.Text, sqlStrSetType, param);
    }

    //删除用户
    public void UserDelete(string id)
    {
        string sqlStr = "delete from tUser where userID = @id";
        SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, System.Data.CommandType.Text,
            sqlStr, new SqlParameter("@id", id));
    }
}
1.2.5 BLL层搭建

这一层主要对传进来的数据进行逻辑判断的操作

public class BLL_UserInfo
{
    private DAL.UserInfo dal_userInfo = new DAL.UserInfo();
    //增加用户
    public bool UserAdd(Model.Mod_UserInfo mod_userInfo)
    {
        //判断信息是否为空
        if(mod_userInfo != new Model.Mod_UserInfo())
        {
            if(mod_userInfo.UserID.Length == 12)
            {
                dal_userInfo.UserAdd(mod_userInfo);
                return true;
            }
        }
        return false;
    }
    //列举用户
    public List<Model.Mod_UserInfo> UserList()
    {
        List<Model.Mod_UserInfo> userInfos = dal_userInfo.UserList();
        return userInfos;
    }
    //查找用户
    public Model.Mod_UserInfo UserSearch(string id)
    {
        Model.Mod_UserInfo userInfo = dal_userInfo.UserSearch(id);
        return userInfo;
    }
    //修改用户
    public bool UserUpdate(Model.Mod_UserInfo mod_userInfo)
    {
        if (mod_userInfo != new Model.Mod_UserInfo())
        {
            if (mod_userInfo.UserID.Length == 12)
            {
                dal_userInfo.UserUpdate(mod_userInfo);
                return true;
            }
        }
        return false;
    }
    //删除用户
    public void UserDelete(Model.Mod_UserInfo mod_userInfo)
    {
        dal_userInfo.UserDelete(mod_userInfo.UserID);
    }
    //登录用户
    public bool UserSignIn(Model.Mod_UserInfo mod_userInfo)
    {
        //获取数据库中用户信息列表
        List<Model.Mod_UserInfo> userInfos = UserList();

        //判断是否符合登录标准(需要root用户)
        foreach (Model.Mod_UserInfo userInfo in userInfos)
        {
            if (mod_userInfo.UserID.Equals(userInfo.UserID) && 
                mod_userInfo.UserPWD.Equals(userInfo.UserPWD) &&
                mod_userInfo.UserType.Equals("root"))
            { 
                return true;
            }
        }
        return false;
    }
}
1.2.6 UI层搭建

这一层主要是与用户的交互,以登录界面的设计为例。

//登录窗口类
public partial class FormSignIn : System.Windows.Forms.Form
{
    public FormSignIn()
    {
        InitializeComponent();
    }
    private void FormSignIn_Load(object sender, EventArgs e)
    {

    }
    
    //登录按钮触发事件
    private void btnSignIn_Click(object sender, EventArgs e)
    {
        Model.Mod_UserInfo mod_userInfo = new Model.Mod_UserInfo();
        BLL.BLL_UserInfo bll_userInfo = new BLL.BLL_UserInfo();

        //获取用户输入信息
        mod_userInfo.UserID = textBoxUserID.Text;
        mod_userInfo.UserPWD = textBoxUserPWD.Text;
        if(chkBoxReader.Checked )
        {
            mod_userInfo.UserType = "reader";
        }
        else
        {
            mod_userInfo.UserType = "root";
        }

        //传给bll层判断是否符合
        if (bll_userInfo.UserSignIn(mod_userInfo))
        {
            this.DialogResult = DialogResult.OK;
        }
        else
        {
            MessageBox.Show("ID or PassWord wrong.", "Wrong");
        }
    }

    //复选框触发事件(不能同时选root和reader)
    private void chkBoxRoot_CheckedChanged(object sender, EventArgs e)
    {
        if (chkBoxRoot.Checked) { chkBoxReader.Checked = false; }
        else { chkBoxReader.Checked = true; }
    }

    private void chkBoxReader_CheckedChanged(object sender, EventArgs e)
    {
        if (chkBoxReader.Checked) { chkBoxRoot.Checked = false; }
        else { chkBoxRoot.Checked = true; }
    }
}

2 遇见问题

2.1 Windows上.Net开发环境搭建

在搭建.Net开发环境时主要遇到VS2022中无法加载进入桌面应用项目。右键资源管理器选择手动加载时报错"无法找到 .Net SDK,请确保已安装此项目的’global.json’中指定的版本与所安装的版本一致"

根据“找不到 .Net SDK”,先找到"C:\Program Files\dotnet"这个安装 .Net SDK 的地方确保已安装 .Net 。同时打开sdk文件夹如果没有6.0或以上的版本,先安装 .Net 。

如果已有.Net可以打开cmd窗口使用

dotnet info

打印.Net相关信息可能会显示Program Files(X86)的 .Net,这时去改一下环境变量把(X86)的dotnet路径删掉。添加"Program Files/dotnet"这时再打印下就会改用64位的 .Net。

然后还有版本可能是最新的可以通过

dotnet --version

查询当前使用的版本。然后通过global.json进行修改成自己需要的版本。如

dotnet new globaljson --sdk-version 3.1.100

可以把当前使用版本调整为3.1。

2.2 与数据库进行连接时遇到问题

  • 方法一:先建立sqlconnection这是个类对象,然后对它的属性填入自己连接的数据库信息。而这个类需要导入一个必要的NuGet包"System.Data.SqlClient"。导入方法就是点击菜单栏的项目,然后有一个导入NuGet包,再浏览搜索这个名字,下载就行。
  • 方法二:这个其实是建立再方法一上的,只不过只需要定义一个连接字符串
public static string connectionString = "Data Source=127.0.0.1;Initial Catalog=dbLibrary;User ID=sa;Password=123;";

再调用"SqlConnection(connectionString)"这个函数就行了。这其实就又回到方法一。

2.3 UI层设计时实现主窗口内多个窗口的切换效果

首先需要再主窗口加入panel面板,然后再在面板内添加窗体控件(注意不是窗体)。可以先设计好子窗体控件然后在运行时将它加入主窗口的面板处。

//主窗口加载程序
private void FormMain_Load(object sender, EventArgs e)
{
    //向主窗口增加一个窗口控件,使主窗口内能够切换多个小窗口
    ControlWin_ListUserInfo formListUserInfo = new ControlWin_ListUserInfo();
    panWin.Controls.Add(formListUserInfo);
}

2.4 获取控件

获取子窗体控件里的控件也十分重要,这时需要用到pannel.Controls或者form.Controls等控件集合属性。将他们的集合遍历一下就可以了。

//获取窗体或面板里的控件
private Control? GetControl(Control.ControlCollection controlCollection)
{
    foreach (Control control in controlCollection)
    {
        //获取控件里的控件
        if (control.Controls.Count != 0)
            return GetControl(control.Controls);
        else
            return control;
    }
    return null;
}

2.5 登录窗口与主窗口运行顺序

在winform项目中程序一般在主函数开始执行后就会添加一个窗口的线程(就是无限循环),这是如果你有一个登录窗口和一个主窗口,程序会先进入登录。这时,如果想关掉这个窗口

this.Close();

那整个程序就关掉了,无法再进入主窗口。我的做法是先让登录窗口作为一个对话框显示,登录成功后,让对话框改变一个值,主程序就判断该值,如果该值为真,就开始主窗口的线程。

static void Main()
{
    FormSignIn formSignIn = new FormSignIn();
                
    if (formSignIn.ShowDialog() == DialogResult.OK)
    {
        Application.Run(new FormMain());
    }
    else
    {
        return;
    }
}

3 项目地址

GitHub地址

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库应用系统设计与开发报告实例 自习室座位管理系统 一、开发背景 每学期期末,华师校园都会掀起一阵自习热,一时间,自习室供不应求。许多同学天 还未亮专程赶到自习室去占座,特别是高职A栋自习室,每天早上都有几百号人涌在大门 口等待开门,隐藏着巨大的安全隐患。 现代信息技术的飞速发展给我们生活带来了极大的便利和无穷的乐趣。,如果我们将 信息技术运用至自习室座位管理系统,那么再给我们带来方便的同时,也能让我们时刻 体会到数字化华师的乐趣。 需求分析 (一)系统需求 自习室座位管理系统应该具有信息全面准确、更新快速、显示简洁移动等特点。自习室 座位信息更新界面应简单易用,输入方便,这样才能使自习室管理者能够方便快捷地对 当前自习室座位信息情况进行更新。 (二)功能需求 自习室座位管理系统主要为学生提供自习室座位情况信息,学生可以通过网络查询开 放的自习室和各自习室的人数。管理员可定时更新各个自习室的剩余座位数信息。 学生查询功能:为了方便学生查找自习室座位等信息,将所有信息按照需要进行分类。 这样学生就能很方便的找到自己需要的信息。 学生登记功能:学生可以通过简单的操作,例如刷信息卡等进行自习登记。 添加功能:管理员可以通过填写表格的形式输入开放的自习室等相关信息。系统可以自 动避免重复信息。 更新功能:管理员可以对数据库中的信息进行更新。系统能够通过当前开放的自习室提 供需要更新的信息,对更新后的信息进行保存,并自动查找是否是重复信息。 删除功能:管理员可以对数据进行删除操作。系统能够通过管理员给出的条件查找出要 删除的信息,并提示是否确定删除,如果确定删除,则把相关信息从数据库中删除掉。 管理员查询功能:管理员可以通过条件选择查询所有信息,并进行排序。 统计功能:管理员可以通过此功能对信息进行统计。如统计当天各个自习室自习人数等 。 三、系统设计 (一)系统功能模块图 "自习室座位管理系统"主要分为学生信息和自习室信息两个方面信息服务子系统,其 功能模块划分如图1所示。 图1 "自习室座位管理系统"系统主模块功能图 (二)各模块功能设计 1、登录模块:填写学生的学号,填写正确的密码,进入相应的自习室查询模块。 2、显示模块:显示要求的内容。 3、查询模块:提供多种查询条件,可按需要进行查询。 4、添加模块:向数据库中添加空闲自习室记录。 5、更新模块:在数据库中更新自习室剩余座位信息。 6、删除模块:在数据库中找到要删除的记录,并将其删除。 7、统计模块:对数据库中的信息进行统计。 四、数据库设计(数据库概念结构设计、数据库逻辑结构设计) (一)数据库概念结构设计 系统E-R图 (二)数据库的逻辑设计 根据系统功能设计的要求以及功能模块的划分,对于系统信息数据库,可以列出以下 数据项和数据结构: 1. 学生信息表 用户信息表包括学号、密码、学生宿舍(方便寻找最近的自习室)、是否自习、自习 教室五个字段。学生信息表如表1所示。 表1 学生信息表 "名称 "字段名称 "数据类型 "主键 "非空 " "学号(唯一 "Stu_ID "数字 "Yes "Yes " "性标识) " " " " " "密码 "Stu_Password"文本 "No "Yes " "宿舍 "Dormitory "文本 "No "No " "是否自习 "Study "布尔 "No "No " "自习教室 "Room_name "文本 "No "No " 2.自习室信息表 自习室信息表包括自习室编号、自习室名称、空调、座位数、剩余座位五个字段。如 表2所示。 表2 自习室信息表 "名称 "字段名称 "数据类型 "主健 "非空 " "自习室编号( "Room_nub "数字 "Yes "Yes " "唯一性标识) " " " " " "自习室名称 "Room_name "文本 "No "No " "空调 "Air-condit"布尔 "No "No " " "ion " " " " "座位数 "Seat "数字 "No "No " "剩余座位数 "Empty_seat"数字 "No "No " 3.管理员信息表 管理员信息表包括管理员编号、管理员密码、自习室编号三个字段。如表3所示。 表3航班信息表 "名称 "字段名称 "数据类型 "主健 "非空 " "管理员编号( "Admi_NUB "数字 "Yes "Yes " "唯一性标识) " " " " " "管理员密码 "Admi_Password"文本 "No "No " "自习室编号 "Roomnub "数字 "No "No " 五、数据库系统的实现 1.数据表结构的实现 经过前面的需求分析和概念结构设计以后,得到了数据库的逻辑结构。现在就可以在 SQL Server数据库系统中实现该逻辑结构。可以直接在SQL S
### 回答1: C#图书管理系统可以使用SQL Server作为数据库,通过C#语言编写程序实现对图书信息的管理。SQL Server是一种关系型数据库管理系统,可以存储和管理大量的数据,并提供了强大的查询和分析功能。在C#图书管理系统中,可以使用SQL Server来存储图书的基本信息,如书名、作者、出版社、ISBN号等,同时还可以记录图书的借阅情况、归还情况等。通过C#程序与SQL Server数据库进行交互,可以实现对图书信息的增加、删除、修改和查询等操作,从而实现高效的图书管理。 ### 回答2: 很抱歉,您的问题不够完整和明确,无法给出恰当的回答。请提供更多信息和背景,方便我为您提供更准确的答案。 ### 回答3: C是一门编程语言,最初由贝尔实验室的丹尼斯·里奇和肯·汤普森在20世纪70年代早期开发。C语言是一种结构化程序设计语言,它的适用范围非常广泛,常被用于编写系统软件、操作系统和驱动程序等。C语言的语法简单、效率高,因此也被广泛应用于网络编程、嵌入式系统等领域。 C语言具有很强的可移植性,同一个程序可以在不同的操作系统和硬件平台上运行,这也是它得到广泛支持和应用的原因之一。此外,C语言广泛使用指针和地址的概念,可以更高效地进行许多操作,包括内存管理和数据结构。 C语言还有一个特点是可以很方便地与汇编语言相结合,可以直接访问硬件资源,因此C语言也被广泛应用于驱动程序和嵌入式系统开发。C语言库也非常丰富,包括标准库和第三方库,程序员可以利用这些库进行快速开发。 总的来说,C语言是一门非常重要的编程语言,它的广泛应用使得它成为学习计算机应用和编程入门的重要语言之一。学习C语言可以提高编程能力和理解计算机系统的能力,对从事计算机领域的工作都是非常有帮助的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值