基于C#+SQL Server2008 开发三层架构(WinForm)图书管理系统100010014
Posted 神仙别闹
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于C#+SQL Server2008 开发三层架构(WinForm)图书管理系统100010014相关的知识,希望对你有一定的参考价值。
图书管理系统
一、项目背景及意义
当今由于信息技术的飞速发展,图书馆作为社会知识信息媒介的功能日益重要,网络环境下的信息资源建设知识仓库的设计,开放存取学术交流模式,知识管理系统,智能检索,数字参考咨询,数字图书馆领域成为图书馆系统的研究方向。
管理发展至今,综合发展的整体趋势已日渐明显。引进新方法,吸收新思想是促进图书馆系统发展的必要条件。因此,图书馆系统的研究要坚持理论与技术相融合,开展跨学科的交叉研究;要坚持理论与实践相结合,而对现实,回答现实所提出的最迫切的问题;要坚持基础研究和应用研究,前者对后者起指导作用,后者反过来对前者起丰富和发展的作用;要正确处理现实、历史、理论三者之间的关系,这是推进管理系统研究的重要方法。
二、需求分析
2.1 现状分析
以往,人们使用传统的人工方式管理图书馆的日常业务,其操作流程比较繁琐。在借书时,读者首先将要借的书好借阅证交给工作人员,然后工作人员将每本书的信息卡片好读者的借阅证放在一个小格栏里,最后在借阅证和每本书贴的借阅条上填写借阅信息。在还书时,读者首先将要还的书交给工作人员,然后工作人员根据图书信息找到相应的书卡好借阅证,并填写相应的还书信息。
学校图书馆有许多书,如果靠人工的方式来进行管理,那么工作量会非常大。图书的统计和管理会成为让人头疼的问题,读者借阅图书进行登记也会十分的不方便。这时,利用计算机来为我们进行这些统计管理的工作,可以给我们的生活带来大大的便利,并且提高工作效率。由于条件有限,只能使用键盘输入书的信息,所以在输入图书的ISBN号时有些麻烦。所以在课设里,采用了图书编号。在现实生活中,采用扫描的方式录入ISBN号会更加准确,高效。
2.2 系统功能需求
图书管理系统是针对图书馆工作人员开发的管理软件,实现对图书信息、用户信息的管理功能。
本系统主要能够完成以下功能:
-
图书信息管理(查询、修改、新增、删除)
-
用户信息管理(查询、修改、新增、删除)
-
借书操作、还书操作、续借操作、借书记录查看
-
图书和用户分类管理(查询、修改、新增、删除)
2.3 系统设计目标
-
系统中的数据表设计合理、高效、数据冗余少
-
软件界面友好、安全性高
-
易于维护、方便升级
三、系统可行性分析
3.1 技术可行性
图书管理系统的开发环境是Visual Studio 2010、Microsoft SQL Server 2008R2 SP3。系统是应用C/S的交互方式实现,本系统具有稳定性、安全性、美观性、先进性。系统现阶段的发展过程中,利用现有的人力物力是完全具备的能力开发出来的,作为阶段性产品,日后的发展空间大,实现方法逐步简单容易,所以图书管理系统的技术上是完全可行的。在当前的限制条件下,该系统的功能目标能达到。
3.2 经济可行性
计算机专业师生团队可以进行日常的系统维护,工作量少,经济支出少。
3.3 操作可行性
所有界面具有风格统一,不同栏目的页面文字风格统一,重点突出图书管理平台的特点,系统页面友好,操作简单,即使没有计算机基础的老师也很好上手。
四、使用的相关技术
4.1 C#
C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相。C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。
4.2 SQL server
SQL Server是由Microsoft开发和推广的关系数据库管理系统(DBMS),它最初是由Microsoft、Sybase和Ashton-Tate三家公司共同开发的,并于1988年推出了第一个OS/2版本。Microsoft SQL Server近年来不断更新版本,1996年,Microsoft 推出了SQL Server 6.5版本;1998年,SQL Server 7.0版本和用户见面;SQL Server 2000是Microsoft公司于2000年推出,目前最新版本是2017年份推出的SQL SERVER 2017。
五、系统详细设计
5.1 总体设计
以Microsoft SQL Server 2008R2 sp3、Visual Studio 2010作为开发环境,使用数据库技术以及.net开发技术,从用C#三层架构:表现层(UI(User Interface))、业务逻辑层(BLL(Business Logic Layer))、数据访问层(DAL(Data Access Layer))再加上实体类库(Model),开发此图书管理系统。
5.2 数据库设计
5.2.1 数据流图
5.2.2 数据字典
Admin表
BookInfo表
BookType表
BorrowReturn表
Class表
Department表
Reader表
ReaderType表
5.2.3 逻辑结构
-
管理员(管理员ID,密码,类型,备注)
-
图书信息(图书ID,书名,入库时间,作者,拼音码,翻译者,语言,页数,价格,印刷版面,存放位置,ISBN码,版本,备注)
-
图书类型(图书类型ID,图书类型名称)
-
图书借还(图书借还ID,图书ID,用户ID,借书时间,应还书时间,真实还书时间,罚金,续借次数,备注)
-
用户班级(班级ID,班级名称)
-
用户学院(学院ID,学院名称)
-
用户信息(用户ID,用户姓名,登记时间,有效期,用户类型,学院,班级,身份证号,性别,QQ,电话,Email,地址,备注)
-
用户学院(用户类型ID,用户类型名称)
5.3 安全性设计
系统有两种管理员:第一种是普通管理员,拥有除管理员管理之外所以权限;第二种是超级管理员,拥有最高权限,可以修改普通管理员。这样的设定使得数据库数据不会被随意篡改。
系统概念设计图
六、方案分析
6.1 可操作性分析
所有页面具有统一的风格,页面文字风格统一,在构思上重点突出图书管理平台的特点,以获得较佳的浏览效率。
6.2 先进性分析
本系统是应用C/S的交互方式实现,从用C#三层架构:表现层(UI(User Interface))、业务逻辑层(BLL(Business Logic Layer))、数据访问层(DAL(Data Access Layer))再加上实体类库(Model),开发此图书管理系统,达到了本系统的稳定性、安全性、美观性性、先进性。
6.3 稳健性分析
系统目前还处在完成最基本功能阶段,不会有大量的用户访问,服务器使用阿里云,稳健性较好。
6.4 可扩展性分析
系统页面简洁,添加新页面很方便,新功能并不会与已有功能相冲突,具有很强的扩展性。而且系统中的数据库可以随学校的规模的变化进行动态的扩充或缩减。
6.5 可维护性分析
程序简单,数据库数据冗余少,使用日志文件等可恢复数据库,可维护性强。
七、系统测试
7.1 测试概述
编写测试用例并进行测试,找出bug并改正。
7.2 测试资源与环境
7.2.1 硬件配置
电脑型号:战神Z6S1
处理器:Intel(R)Core™i7-4720HQ CPU @2.60GHz 2.60GHz
7.2.2 软件配置
操作系统:Windows 10 专业版 64位操作系统
使用软件:Microsoft Visual Studio 2010
SQL server 2008R2 SP3
7.3 测试内容
7.3.1 管理员模块
图7.1 管理员模块
7.3.2 图书管理模块
图7.2 图书管理模块
图7.2 新增图书
7.3.3 用户管理模块
图7.4 用户管理模块
图7.5 用户新增
7.3.4 图书借还模块
图7.6 图书借还
7.3.5 分类管理模块
图7.7 分类管理模块
7.3.6 查询模块
图7.8 图书借还记录
图7.9 查询
八、附录
8.1 部分源码
8.1.1 图书借还
//查询BorrowReturn表信息
public DataSet selectHostory(BorrowReturn b, string radioName, String cboBorrowTimeType, Boolean checkTime)
string sql = string.Format(@"select BookInfo.BookId as 'BookId',Reader.UserId as 'UserId',BookName,UserName,BookTypeName,UserTypeName,Gender,IdentityCard,BorrowTime,ReturnTime,FactReturnTime,Fine,RenewCount from BorrowReturn
inner join BookInfo on BookInfo.BookId=BorrowReturn.BookId
inner join Reader on Reader.UserId=BorrowReturn.UserId
inner join BookType on BookType.BookTypeId=BookInfo.BookTypeId
inner join ReaderType on ReaderType.UserTypeId=Reader.UserTypeId
where BookInfo.BookId like '%0%' and
Reader.UserId like '%1%' ", b.BookId, b.UserId);
if (radioName == "全部")
else if (radioName == "已借")
sql += " and FactReturnTime is null ";
else if (radioName == "已还")
sql += " and FactReturnTime is not null ";
return DBhelp.Create().ExecuteAdater(sql);
//查询BorrowReturn表全部信息
public DataSet AllBorrowReturn()
string sql = @"select BookInfo.BookId as 'BookId',Reader.UserId as 'UserId',BookName,UserName,BookTypeName,UserTypeName,Gender,IdentityCard,BorrowTime,ReturnTime,FactReturnTime,Fine,RenewCount from BorrowReturn
inner join BookInfo on BookInfo.BookId=BorrowReturn.BookId
inner join Reader on Reader.UserId=BorrowReturn.UserId
inner join BookType on BookType.BookTypeId=BookInfo.BookTypeId
inner join ReaderType on ReaderType.UserTypeId=Reader.UserTypeId";
return DBhelp.Create().ExecuteAdater(sql);
//查询图书BorrowReturn表(表连接)
public DataSet selectBorrowReturn(string BookId)
string sql = @"select BookInfo.BookId,BookName,Reader.UserId,UserName,BorrowTime,ReturnTime,FactReturnTime,Fine,RenewCount,BorrowRemark from BookInfo
inner join BorrowReturn on BorrowReturn.BookId=BookInfo.BookId
inner join Reader on Reader.UserId=BorrowReturn.UserId
where BookInfo.BookId=@BookId ";
SqlParameter[] sp =
new SqlParameter("@BookId",BookId)
;
return DBhelp.Create().ExecuteAdater(sql, sp);
//用户借阅记录
public DataSet ReaderBorrowReturn(string UserId)
string sql = @"select BorrowId,Reader.UserId as 'UserId',UserName,BookInfo.BookId as 'BookId',BookName,BorrowTime,ReturnTime,FactReturnTime,Fine,RenewCount,BorrowRemark from Reader
inner join BorrowReturn on BorrowReturn.UserId=Reader.UserId
inner join BookInfo on BookInfo.BookId=BorrowReturn.BookId
where Reader.UserId=@UserId and FactReturnTime is null ";
SqlParameter[] sp =
new SqlParameter("@UserId",UserId)
;
return DBhelp.Create().ExecuteAdater(sql, sp);
//用户历史借阅记录
public DataSet ReaderBorrowReturn1(string UserId)
string sql = @"select BorrowId,Reader.UserId as 'UserId',UserName,BookInfo.BookId as 'BookId',BookName,BorrowTime,ReturnTime,FactReturnTime,Fine,RenewCount,BorrowRemark from Reader
inner join BorrowReturn on BorrowReturn.UserId=Reader.UserId
inner join BookInfo on BookInfo.BookId=BorrowReturn.BookId
where Reader.UserId=@UserId and FactReturnTime is not null ";
SqlParameter[] sp =
new SqlParameter("@UserId",UserId)
;
return DBhelp.Create().ExecuteAdater(sql, sp);
//还书
public int ReturnBook(int BorrowReturnId)
string sql = @"update BorrowReturn set FactReturnTime=@FactReturnTime,RenewCount=0 where BorrowId=@BorrowId";
SqlParameter[] sp =
new SqlParameter("@FactReturnTime",DateTime.Now),
new SqlParameter("@BorrowId",BorrowReturnId)
;
return DBhelp.Create().ExecuteNonQuery(sql, sp: sp);
//借书
public int BorrowBook(BorrowReturn b)
string sql = "proc_BorrowBook";
Console.WriteLine(b.BookId);
SqlParameter[] sp =
new SqlParameter("@BorrowId",DbType.Int32),
new SqlParameter("@BookId",b.BookId),
new SqlParameter("@UserId",b.UserId),
new SqlParameter("@BorrowTime",b.BorrowTime),
new SqlParameter("@ReturnTime",b.ReturnTime),
new SqlParameter("@Fine",b.Fine),
new SqlParameter("@RenewCount",b.RenewCount),
new SqlParameter("@BorrowRemark",b.BorrowRemark),
new SqlParameter("@ReturnValue",DbType.Int32)
;
sp[0].Direction = ParameterDirection.Output;
sp[sp.Length - 1].Direction = ParameterDirection.ReturnValue;
DBhelp.Create().ExecuteNonQuery(sql, CommandType.StoredProcedure, sp);
b.BorrowId = (int)sp[0].Value;
return (int)sp[sp.Length - 1].Value;
//续借
public int RenewBook(BorrowReturn b)
string sql = @"update BorrowReturn set ReturnTime=dateadd(month,3,ReturnTime),RenewCount=RenewCount+1 where BorrowId=@BorrowId";
SqlParameter[] sp =
new SqlParameter("@BorrowId",b.BorrowId)
;
return DBhelp.Create().ExecuteNonQuery(sql, sp: sp);
8.1.2 图书管理及查询
//查询BookInfo表
public List<BookInfo> selectBookInfo()
string sql = @"select BookId,BookName,TimeIn,BookTypeName,Author,PinYinCode,Translator,Language,BookNumber,Price,Layout,Address,ISBN,Versions,BookRemark from BookInfo
inner join BookType on BookType.BookTypeId=BookInfo.BookTypeId";
List<BookInfo> list = new List<BookInfo>();
SqlDataReader reader = DBhelp.Create().ExecuteReader(sql);
while (reader.Read())
BookInfo b = new BookInfo();
b.BookId = reader.GetString(0);
b.BookName = reader.GetString(1);
b.TimeIn = reader.GetDateTime(2);
b.BookType = new BookType();
b.BookType.BookTypeName = reader.GetString(3);
b.Author = reader.GetString(4);
b.PinYinCode = reader.GetString(5);
b.Translator = reader.GetString(6);
b.Language = reader.GetString(7);
b.BookNumber = reader.GetString(8);
b.Price = reader.GetString(9);
b.Layout = reader.GetString(10);
b.Address = reader.GetString(11);
b.ISBN = reader.GetString(12);
b.Versions = reader.GetString(13);
b.BookRemark = reader.GetString(14);
list.Add(b);
reader.Close();
return list;
//根据ID查询bookinfo表
public List<BookInfo> selectBookInfo(string BookId)
string sql = @"select BookId,BookName,TimeIn,BookTypeId,Author,PinYinCode,Translator,Language,BookNumber, Price,Layout,Address,ISBN,Versions,BookRemark from BookInfo where BookId=@BookId";
SqlParameter[] sp =
new SqlParameter("@BookId",BookId)
;
SqlDataReader reader = DBhelp.Create().ExecuteReader(sql, sp);
List<BookInfo> list = new List<BookInfo>();
while (reader.Read())
BookInfo b = new BookInfo();
b.BookId = reader.GetString(0);
b.BookName = reader.GetString(1);
b.TimeIn = reader.GetDateTime(2);
b.BookTypeId = reader.GetInt32(3);
b.Author = reader.GetString(4);
b.PinYinCode = reader.GetString(5);
b.Translator = reader.GetString(6);
b.Language = reader.GetString(7);
b.BookNumber = reader.GetString(8);
b.Price = reader.GetString(9);
b.Layout = reader.GetString(10);
b.Address = reader.GetString(11);
b.ISBN = reader.GetString(12);
b.Versions = reader.GetString(13);
b.BookRemark = reader.GetString(14);
list.Add(b);
reader.Close();
return list;
//查询BookInfo表
public DataSet selectBookInfo1()
string sql = @"select BookId,BookName,TimeIn,BookTypeName,Author,PinYinCode,Translator,Language,BookNumber,Price,Layout,Address,ISBN,Versions,BookRemark from BookInfo inner join BookType on BookType.BookTypeId=BookInfo.BookTypeId";
return DBhelp.Create().ExecuteAdater(sql);
public DataSet selectBook;
//查询BookInfo表 目前可以借阅的图书
public DataSet selectBookInfo2(string BookId)
string sql = @"select BookInfo.BookId as 'BookId',BookName,TimeIn,BookTypeName,Author,PinYinCode,Translator,Language,BookNumber,Price,Layout,Address,ISBN,Versions,BookRemark from BookInfo
inner join BookType on BookType.BookTypeId=BookInfo.BookTypeId
where BookInfo.BookId like '%'+@BookId+'%' and BookInfo.BookId not in(select BookId from BorrowReturn where FactReturnTime is null )";
SqlParameter[] sp =
new SqlParameter("@BookId",BookId)
;
return DBhelp.Create().ExecuteAdater(sql, sp: sp);
//根据条件查询bookinfo表
public DataSet selectBookInfo1(int index)
string sql = @"select BookId,BookName,TimeIn,BookTypeName,Author,PinYinCode,Translator,Language,BookNumber,Price,Layout,Address,ISBN,Versions,BookRemark from BookInfo
inner join BookType on BookType.BookTypeId=BookInfo.BookTypeId
where BookType.BookTypeId=@BookTypeId";
SqlParameter[] sp =
new SqlParameter("@BookTypeId",index)
;
return DBhelp.Create().ExecuteAdater(sql, sp);
//根据条件查询bookinfo表
public DataSet selectBookInfo1(string A, string B)
string sql = string.Format(@"select BookId,BookName,TimeIn,BookTypeName,Author,PinYinCode,Translator,Language,BookNumber,Price,Layout,Address,ISBN,Versions,BookRemark from BookInfo
inner join BookType on BookType.BookTypeId=BookInfo.BookTypeId
where 0 like '%1%'", A, B);
return DBhelp.Create().ExecuteAdater(sql);
//查询BookInfo表 带全部查询(表中所有相关的字段)
public DataSet selectBookInfo1(List<string> list, string B)
string sql = "";
for (int i = 0; i < list.Count; i++)
if (i != list.Count - 1)
sql += string.Format(@"select BookId,BookName,TimeIn,BookTypeName,Author,PinYinCode,Translator,Language,BookNumber,Price,Layout,Address,ISBN,Versions,BookRemark from BookInfo
inner join BookType on BookType.BookTypeId=BookInfo.BookTypeId
where 0 like '%1%' union ", list[i], B);
else
sql += string.Format(@"select BookId,BookName,TimeIn,BookTypeName,Author,PinYinCode,Translator,Language,BookNumber,Price,Layout,Address,ISBN,Versions,BookRemark from BookInfo
inner join BookType on BookType.BookTypeId=BookInfo.BookTypeId
where 0 like '%1%' ", list[i], B);
return DBhelp.Create().ExecuteAdater(sql);
//添加图书信息
public int AddBookInfo(BookInfo book)
string sql = @"insert into BookInfo select @BookId,@BookName,@TimeIn,@BookTypeId,@Author,@PinYinCode,@Translator,@Language,@BookNumber,@Price,@Layout,@Address,@ISBN,@Versions,@BookRemark";
SqlParameter[] sp =
new SqlParameter("@BookId",book.BookId),
new SqlParameter("@BookName",book.BookName),
new SqlParameter("@TimeIn",book.TimeIn),
new SqlParameter("@BookTypeId",book.BookTypeId),
new SqlParameter("@Author",book.Author),
new SqlParameter("@PinYinCode",book.PinYinCode),
new SqlParameter("@Translator",book.Translator),
new SqlParameter("@Language",book.Language),
new SqlParameter("@BookNumber",book.BookNumber),
new SqlParameter("@Price",book.Price),
new SqlParameter("@Layout",book.Layout),
new SqlParameter("@Address",book.Address),
new SqlParameter("@ISBN",book.ISBN),
new SqlParameter("@Versions",book.Versions),
new SqlParameter("@BookRemark",book.BookRemark),
;
return DBhelp.Create().ExecuteNonQuery(sql, sp: sp);
//修改图书信息
public int ExitBookInfo(BookInfo book)
string sql = @"update BookInfo set BookName=@BookName,TimeIn=@TimeIn,BookTypeId=@BookTypeId, Author=@Author,PinYinCode=@PinYinCode,Translator=@Translator,Language=@Language,BookNumber=@BookNumber,Price=@Price,Layout=@Layout,Address=@Address,ISBN=@ISBN,Versions=@Versions,BookRemark=@BookRemark
where BookId=@BookId";
SqlParameter[] sp =
new SqlParameter("@BookName",book.BookName),
new SqlParameter("@TimeIn",book.TimeIn),
new SqlParameter("@BookTypeId",book.BookTypeId),
new SqlParameter("@Author",book.Author),
new SqlParameter("@PinYinCode",book.PinYinCode),
new SqlParameter("@Translator",book.Translator),
new SqlParameter("@Language",book.Language),
new SqlParameter("@BookNumber",book.BookNumber),
new SqlParameter("@Price",book.Price),
new SqlParameter("@Layout",book.Layout),
new SqlParameter("@Address",book.Address),
new SqlParameter("@ISBN",book.ISBN),
new SqlParameter("@Versions",book.Versions),
new SqlParameter("@BookRemark",book.BookRemark),
new SqlParameter("@BookId",book.BookId)
;
return DBhelp.Create().ExecuteNonQuery(sql, sp: sp);
//根据Id删除
public int DeleteBookInfo(string BookId)
string sql = @"delete from BorrowReturn where BookId=@BookId
delete from BookInfo where BookId=@BookId";
SqlParameter[] sp =
new SqlParameter("@BookId",BookId)
;
return DBhelp.Create().ExecuteNonQuery(sql, sp: sp);
♻️ 资源
大小: 2.4MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87247973
C#&SQL Server基于三层架构实现增删改查
C # SQL Server implement CRUD-based three-tier architecture
先来看看C#和SQL Server的整个框架
C#
SQL Server
这是本次使用到数据库的一些信息
服务器名称:DESKTOP-D258CHD\WINCC
登录用户:sa 密码:123
数据库:Architecture_demo 表名:Student
清楚了框架那么现在开始编写C#部分的程序
1_首先创建以下四个项目
BLL、DAL、Model为".dll类库"项目,UI为"Windows窗体应用程序"项目
2_Model实体模型搭建
创建Students类,且Students要为public
C#中的Students类与数据库中的Student的表,是多了一个“s”的,用于区分
这里的属性要与数据库中的Student表要一样
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Model
{
public class Students
{
public int student_ID { get; set; }
public string name { get; set; }
public int age { get; set; }
public string gender { get; set; }
}
}
3_DAL数据访问层
首先在UI项目里的App.config文件中添加一段代码,在数据库服务器名称和密码发生改变时,不用修改程序代码,只需要修改App.config文件中这段代码既可
Server:数据库服务器的名称 DataBase:数据库名称
Uid:用户名 Pwd:密码
<connectionStrings>
<add name="connString" connectionString="Server=DESKTOP-D258CHD\WINCC;DataBase=Architecture_demo;Uid=sa;Pwd=123" />
</connectionStrings>
然后返回到DAL项目,在DAL项目引用里添加System.Configuration,用于读取UI项目的App.config文件
在DAL项目里创建SQLHelper类,SQLHelper要为public,同时引入System.Data、System.Data.SqlClient、System.Configuration
System.Data:提供对数据的操作
System.Data.SqlClient:提供对数据库的操作
System.Configuration:提供对App.config的操作
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace DAL
{
public class SQLHelper
{
}
}
开始编写数据访问层代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace DAL
{
public class SQLHelper
{
private static readonly string connString = ConfigurationManager.ConnectionStrings["connString"].ToString();
/// <summary>
/// 对数据库进行增删改
/// </summary>
/// <param name="sql">要查询的SQL语句</param>
/// <returns>返回受影响的行数</returns>
public static int Update(string sql)
{
//与数据库连接的字符串
SqlConnection conn = new SqlConnection(connString);
//SQL语句
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
//与数据库建立连接
conn.Open();
return cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
//断开与数据库的连接
conn.Close();
}
}
/// <summary>
/// 执行单一结果查询
/// </summary>
/// <param name="sql">要查询的SQL语句</param>
/// <returns>返回单一的查询结果</returns>
public static object GetSingleResult(string sql)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
conn.Open();
return cmd.ExecuteScalar();
}
catch (Exception ex)
{
throw ex;
}
finally
{
conn.Close();
}
}
/// <summary>
/// 执行一个结果集的查询
/// </summary>
/// <param name="sql">要查询的SQL语句</param>
/// <returns>返回一个SqlDataReader对象</returns>
public static SqlDataReader GetReader(string sql)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
conn.Open();
SqlDataReader objReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return objReader;
}
catch (Exception ex)
{
throw ex;
}
}
}
}
4_BLL业务逻辑层
在BLL里创建StudentService类,StudentService要为public
引入DAL、Model
接着在StudentService类的代码里引入
System.Data、System.Data.SqlClient
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using DAL;
using Model;
namespace BLL
{
public class StudentService
{
}
}
开始编写业务逻辑层代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using DAL;
using Model;
namespace BLL
{
public class StudentService
{
/// <summary>
/// 增加一条数据
/// </summary>
/// <param name="objStudent"></param>
/// <returns></returns>
public int AddStudent(Students objStudent)
{
//【1】编写sql语句
StringBuilder sqlBuilder = new StringBuilder("insert into Student ");
sqlBuilder.Append(" (name,age,gender) ");
sqlBuilder.Append(" values('{0}',{1},'{2}');select @@identity ");
//【2】解析对象
string sql = string.Format(sqlBuilder.ToString(), objStudent.name,objStudent.age,objStudent.gender);
//【3】提交SQL语句
try
{
return Convert.ToInt32(SQLHelper.GetSingleResult(sql));//执行sql语句,返回学号
}
catch (Exception ex)
{
throw new Exception("添加学员时数据访问异常:" + ex.Message);
}
}
/// <summary>
/// 删除一条数据
/// </summary>
/// <param name="studentId"></param>
/// <returns></returns>
public int DeleteStudent(string studentId)
{
string sql = "delete from Student where Student_ID=" + studentId;
try
{
return SQLHelper.Update(sql);
}
catch (SqlException ex)
{
//547是数据库返回的消息,返回改该消息表示不能被删除
if (ex.Number == 547)
{
throw new Exception("该学号被其他实体引用,不能直接删除该学员对象!");
}
else
{
throw new Exception("删除学员对象发生数据异常!" + ex.Message);
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 修改学生信息
/// </summary>
/// <param name="objStudent"></param>
/// <returns></returns>
public int ModifyStudent(Students objStudent)
{
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.Append("update Student set name='{0}',age={1},gender='{2}' ");
string sql = string.Format(sqlBuilder.ToString(), objStudent.name,objStudent.age,objStudent.gender);
try
{
return SQLHelper.Update(sql);
}
catch (Exception ex)
{
throw new Exception("修改学员信息是数据访问发生异常:" + ex.Message);
}
}
/// <summary>
/// 根据学号查询学生
/// </summary>
/// <param name="studentId"></param>
/// <returns></returns>
public Students GetStudentById(string studentId)
{
string sql = "select Student_ID,name,age,gender from Student ";
sql += " where Student_ID=" + studentId;
SqlDataReader objReader = SQLHelper.GetReader(sql);
Students objStudent = null;
if (objReader.Read())
{
objStudent = new Students()
{
student_ID=Convert.ToInt32(objReader["student_ID"]),
name=objReader["name"].ToString(),
age = Convert.ToInt32(objReader["age"]),
gender=objReader["gender"].ToString()
};
}
objReader.Close();
return objStudent;
}
}
}
5_UI表现层
在工具箱找到TabControl,拖动到窗口
增加两个页面,第一个为“增”,第二个为“删、改、查”,并且修改界面
“增”界面
这里说明一下因为学号在数据库里面是主键,是不能更改的,但是在添加其他数据的时候,学号是会自增数据的,每一条数据+1,这个每次增加的数可以在数据库里面修改的
“删、改、查”界面
引入DAL、BLL、Model
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;
using DAL;
using BLL;
using Model;
namespace UI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}
开始编写UI表现层代码
“增”界面代码
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;
using DAL;
using BLL;
using Model;
namespace UI
{
public partial class Form1 : Form
{
private StudentService objStudentService = new StudentService();
List<Students> stuList = new List<Students>();//用来临时保存学员对象
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 添加按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Add_Click(object sender, EventArgs e)
{
//封装学生对象
Students ojbStudent = new Students()
{
name = this.txt_Z_name.Text.Trim(),
age = Convert.ToInt32(this.txt_Z_age.Text.Trim()),
gender = this.rdoMale.Checked ? "男" : "女"
};
//调用后台数据访问方法
int studentId = objStudentService.AddStudent(ojbStudent);
try
{
//同步显示添加的学员
ojbStudent.student_ID = studentId;
this.stuList.Add(ojbStudent);
this.dgvStudentList.DataSource = null;
this.dgvStudentList.DataSource = this.stuList;
//询问是否继续添加
DialogResult result = MessageBox.Show("新学员添加成功!是否继续添加?", "提示信息", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
//清空用户输入的信息
foreach (Control item in this.gbstuinfo.Controls)
{
if (item is TextBox)
{
item.Text = "";
}
else if (item is RadioButton)
{
((RadioButton)item).Checked = false;
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("添加学员出现数据访问异常" + ex.Message);
}
}
}
}
“删、改、查”界面代码,和“增”界面的一起,这里就是UI全部的代码
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;
using DAL;
using BLL;
using Model;
namespace UI
{
public partial class Form1 : Form
{
private StudentService objStudentService = new StudentService();
List<Students> stuList = new List<Students>();//用来临时保存学员对象
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 添加按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Add_Click(object sender, EventArgs e)
{
//封装学生对象
Students ojbStudent = new Students()
{
name = this.txt_Z_name.Text.Trim(),
age = Convert.ToInt32(this.txt_Z_age.Text.Trim()),
gender = this.rdoMale.Checked ? "男" : "女"
};
//调用后台数据访问方法
int studentId = objStudentService.AddStudent(ojbStudent);
try
{
//同步显示添加的学员
ojbStudent.student_ID = studentId;
this.stuList.Add(ojbStudent);
this.dgvStudentList.DataSource = null;
this.dgvStudentList.DataSource = this.stuList;
//询问是否继续添加
DialogResult result = MessageBox.Show("新学员添加成功!是否继续添加?", "提示信息", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
//清空用户输入的信息
foreach (Control item in this.gbstuinfo.Controls)
{
if (item is TextBox)
{
item.Text = "";
}
else if (item is RadioButton)
{
((RadioButton)item).Checked = false;
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("添加学员出现数据访问异常" + ex.Message);
}
}
/// <summary>
/// 查询按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Inquire_Click(object sender, EventArgs e)
{
if (this.txt_S_StudentId.Text.Length == 0)
{
MessageBox.Show("请输入学号!", "查询提示!");
return;
}
Students objStudent = objStudentService.GetStudentById(this.txt_S_StudentId.Text.Trim());
this.stuList.Add(objStudent);
this.dgvStudentList2.DataSource = null;
this.dgvStudentList2.DataSource = this.stuList;
}
/// <summary>
/// 修改按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Edit_Click(object sender, EventArgs e)
{
if (txt_S_Id.Text == ""||txt_S_name.Text==""||txt_S_age.Text==""||rdo_S_Male.Checked==false&&rdo_S_Female.Checked==false)
{
MessageBox.Show("数据不完整", "提示!");
return;
}
//封装学员对象
Students objStudent = new Students()
{
student_ID=Convert.ToInt32(this.txt_S_Id.Text.Trim()),
name = this.txt_S_name.Text.Trim(),
age=Convert.ToInt32(this.txt_S_age.Text.Trim()),
gender=this.rdoMale.Checked ? "男" : "女"
};
try
{
if (objStudentService.ModifyStudent(objStudent) == 1)
{
MessageBox.Show("学员信息修改成功!", "提示信息");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示信息");
}
}
private void dgvStudentList2_CellClick(object sender, DataGridViewCellEventArgs e)
{
txt_S_Id.Text= this.dgvStudentList2.CurrentRow.Cells["Student_ID"].Value.ToString();
txt_S_name.Text = this.dgvStudentList2.CurrentRow.Cells["name"].Value.ToString();
txt_S_age.Text = this.dgvStudentList2.CurrentRow.Cells["age"].Value.ToString();
if (this.dgvStudentList2.CurrentRow.Cells["gender"].Value.ToString() == "男")
{
rdo_S_Male.Checked = true;
}
else
{
rdo_S_Female.Checked = true;
}
}
private void btn_Delete_Click(object sender, EventArgs e)
{
if (this.dgvStudentList2.RowCount == 0)
{
MessageBox.Show("没有任何需要删除的学员!", "提示信息");
return;
}
if (this.dgvStudentList2.CurrentRow == null)
{
MessageBox.Show("请先选中要删除的学员!", "提示信息");
return;
}
//删除前的确认
DialogResult result = MessageBox.Show("确认删除吗!", "提示信息", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
if (result == DialogResult.Cancel) return;
//获取学号
string studentId = this.dgvStudentList2.CurrentRow.Cells["Student_ID"].Value.ToString();
try
{
objStudentService.DeleteStudent(studentId);
dgvStudentList2.DataSource = null;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示信息");
}
}
}
}
提示:表格的名字和数据名要与数据库的字段对应
最后看下效果
2021/06/17
以上是关于基于C#+SQL Server2008 开发三层架构(WinForm)图书管理系统100010014的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2008 到 SQL Server Compact Edition?
C# Winform点餐系统(源码+SQL Server 2008 R2)