C#毕业设计——基于C#+c+sqlserver的办公耗材库存管理软件设计与实现(毕业论文+程序源码)——库存管理软件

基于C#+c+sqlserver的办公耗材库存管理软件设计与实现(毕业论文+程序源码)

大家好,今天给大家介绍基于C#+c+sqlserver的办公耗材库存管理软件设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。
需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴,可以进入我的博客主页查看左侧最下面栏目中的自助下载方法哦

文章目录:

1、项目简介

  1. 库存管理系统是将企业的存和转等企业的经营业务有机的结合起来,达到数据共享、降低成本、提高效率。本系统前台采用.NET,后台数据库采用SQL Server 2000,语言采用C#。本系统实现的主要功能有库存查询、进货作业、领料作业、库存盘点、损坏处理等。在系统完成后对工作进行了总结,对系统功能进行了测试,并指出了系统中的问题和需要改进的地方。

2、资源详情

项目难度:中等难度
适用场景:相关题目的毕业设计
配套论文字数:12003个字32页
包含内容:整套源码+完整毕业论文


3、关键词:

B/S,C#,库存管理系统,.NET

4、毕设简介

提示:以下为毕业论文的简略介绍,项目源码及完整毕业论文下载地址见文末。

引言
省略

1.1 系统的背景和意义
省略

库存管理系统是基于先进的软件和高速基础上的新型存储管理模式通过集中式的信息数据库,将企业的调、存、转等企业的经营业务有机的结合起来,达到数据共享、降低成本、提高效率、改进服务等目的。主要作用是:提高管理效率降低人工成本;降低采购成本;及时调整营销策略,防止价格流失;减少仓储面积,提高房产综合利用率;降低储备资金占用。

1.2 系统设计目标

  1. 本系统首先要实现动态性和交互性。所谓的动态性就是能动态更新内容,如更新库存信息、进货信息和出货信息等,这要求与数据库有良好的连接;
  2. 一般用户和管理员在使用系统时,实现系统操作方便的特点;
  3. 实现系统的安全性和可靠性,避免他人进入破坏数据库信息。

1.3 系统的开发工具
1.3.1 开发环境

  1. B/S模式介绍:
    B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WEB浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。以目前的技术看,局域网建立B/S结构的网络应用,并通过Internet/Intranet模式下数据库应用,相对易于把握、成本也是较低的。它是一次性到位的开发,能实现不同的人员,从不同的地点,以不同的接入方式(比如LAN、WAN、Internet/Intranet等)访问和操作共同的数据库;它能有效地保护数据平台和管理访问权限,服务器数据库也很安全。特别是在JAVA这样的跨平台语言出现之后,B/S架构管理软件更是方便、快捷、高效。

  2. .NET介绍
    .NET 就是 Microsoft® 的 XML Web 服务平台。不论操作系统或编程语言有何差别,XML Web 服务能使应用程序在 Internet 上传输和共享数据。
    Microsoft® .NET 平台包含广泛的产品系列,它们都是基于XML和Internet行业标准构建,提供从开发、管理、使用到体验 XML Web 服务的每一方面。XML Web 服务将成为您今天正在使用的 Microsoft® 的应用程序、工具和服务器的一部分——并且将要打造出全新的产品以满足您所有业务需求。 更具体地说,Microsoft 正在五个方面创建 .NET 平台,即工具、服务器、XML Web 服务、客户端和 .NET 体验。Web服务从由简单网页构成的静态服务网站,发展到可以交互执行一些复杂步骤的动态服务网站,这些服务可能需要一个Web服务调用其他的Web服务,并且像一个传统软件程序那样执行命令。这就需要和其他服务整合,需要多个服务能够一起无缝地协同工作,需要能够创建出与设备无关的应用程序,需要能够容易地协调网络上的各个服务的操作步骤,容易地创建新的用户化的服务。

  3. C#介绍
    微软推出C#(C sharp) 是微软对这一问题的解决方案。C#是一种最新的、面向对象的编程语言。它使得程序员可以快速地编写各种基于Microsoft .NET平台的应用程序,Microsoft .NET提供了一系列的仅是开发一个“标志性”的版本。C#在设计时就考虑了这些问题。它使开发者用更少的代码做更多的事,同时也不易出错。支持现有的网络编程新标准 新的应用程序开发模型意味着越来越多地解决方案依赖于新出现的网络标准,例如HTML,XML,SOAP等。现存的开发工具往往都是早于Internet出现的,或者是在我们所熟知的网络还处于孕育期时出现的。所以,它们一般工具和服务来最大程度地开发利用计算与通讯领域。正是由于C#面向对象的卓越设计,使它成为构建各类组件的理想之选。无论是高级的商业对象还是系统级的应用程序。使用简单的C#语言结构,这些组件可以方便的转化为XML 网络服务,从而使它们可以由任何语言在任何操作系统上通过Internet进行调用。最重要的是,C#使得C++程序员可以高效的开发程序,而绝不损失C/C++原有的强大的功能。因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快的转向C#。效率与安全性新兴的网络经济迫使商务企业必须更加迅速的应对竞争的威胁。开发者必须不断缩短开发周期,不断推出应用程序的新版本,而不仅无法很好地支持最新的网络技术。

  4. MS SQL Server 介绍
    SQL Server 还为数据库管理与分析带来了灵活性,允许单位在快速变化的环境中从容响应。从而获得竞争优势。从数据和分析角度看,将原始数据转化为商业只能和充分利用Web带来的机会非常重要。作为一个完整的数据库和数据分析包,SQL Server 为快速开发新一代企业级商业应用程序,为企业赢得了核心竞争优势。

1.3.2 编程运行环境
本系统的开发环境为:
硬件环境:
 CPU: AMD Sempron™ 2400+
 内存:512 MB
 硬盘:80 G
软件环境:
 操作系统:Microsoft Windows XP
 应用软件:SQL Server + Microsoft Visual Studio

2 系统需求分析
本系统目的是让管理者能够对仓库存储进行更有效,更经济,更方便地管理而开发的。
2.1 用户身份级别要求
即根据身份的不同对系统的使用权限有所不同。从权限大小大致可以分为:系统管理员、一般注册用户、未注册用户。系统提供灵活的角色设定和权限的分配功能。

  1. 系统管理员:最高级权限的用户,拥有库存管理系统的所有权限。主要负责对库存数据的添加,修改,删除等操作,对一般注册用户下放权限,对系统进行日常的维护和管理,排除故障。
  2. 一般注册用户:权限被限制用户。只具有访问系统中某些功能的操作(如查询。
  3. 未注册用户:未具有任何权限的用户。只能通过注册才能进入库存管理系统。

2.2 系统功能模块设置

  1. 用户注册:未注册用户需注册后才能进入系统。
     操作对象:所有未注册用户。
     浏览对象:所有未注册用户。
     具体操作:注册用户在需填写用户名和密码才能注册。
  2. 用户管理:对注册用户和管理员的基本信息进行操作。对用户权限进行设置。
     操作对象:系统管理员
     浏览对象:系统管理员
  3. 库存查询:合法用户可以查看库存的所有信息,可以查询总库存和各分仓库的库存,用户可以根据种类名和货物名查找匹配的物品。
     操作对象:注册用户、管理员
     浏览对象:注册用户、管理员
  4. 进货作业:管理员通过记录每次进货的物品的详细信息,系统在进货表中产生一条进货记录。
     操作对象:管理员
     浏览对象:管理员
     具体操作:管理员需将物品的货物号,种类号,种类名,货物名,数量,进货价格,仓库号,厂家号依次填入对应的栏目中,最后点击确定即可。
  5. 领料作业:管理员输入每次出货物品的信息,系统在出货单中产生一条出货记录。
     操作对象:管理员
     浏览对象:管理员
     具体操作:管理员在下拉菜单中选择相应的货物种类和货物名,在对应的空白栏中输入出货货物的厂家、数量、单价、领料人的名字,最后单击确定即完成该操作。
  6. 损坏处理:由于功能与领料作业类似,所以属于领料作业的子功能模块。
     操作对象:管理员
     浏览对象:管理员
     具体操作:与领料作业类似。
  7. 库存转库:用于将一个仓库的商品转移到另一个仓库。内容包括编号、源部门、目的部门、数量、货物号、经手人、调货日期等。由于是小型企业,所以同种类的商品都分在同个仓库中,需要调库时需将所有同种类的货物进行转库,不再对同种类不同货物名的商品进行细分。
     操作对象:管理员
     浏览对象:管理员
     具体操作:管理员在下拉菜单中选择该种类货物对应的货物种类、数量和源仓库号,填入目的仓库和经手人即可。
  8. 库存盘点:用于管理企业的库存盘点工作,将实际盘存的商品数量输入计算机,计算机自动与数据库中的库存数量进行核对,并产生盘盈盘亏统计信息。
     操作对象:管理员
     浏览对象:管理员
     具体操作:管理员选择盘点的货物名,输入该货物的厂家和数量,点击确定后即在该页面的下放显示出盘盈盘亏的信息。
  9. 历史查询:用于查询各种转库、盘点、进货、出货的历史数据。
     操作对象:注册用户、管理员
     浏览对象:注册用户、管理员
  10. 退出登录:让所有合法用户在操作完后顺利的退出系统。
     操作对象:所有用户

3 库存管理系统总体设计
3.1 数据库设计
省略

根据毕业设计库存管理系统的一般要求,再通过需求分析得出系统的实体表:用户管理表:ADMIN_LIST,总库存表:GOODS_LIST,货物明细表:GOODS_LIST,货物种类表:GOODS_TYPES,货物名表:GOODSNAME_LIST,进货明细表:JINHUO_LIST,出货明细表:CHUHUO_LIST,货物调拨表:MOVE_LIST,盘点表:PanDian_LIST,货物损坏表:SUNHUAI_LIST。共10张表。

根据系统运行分析和数据流程分析,设计出实际的数据库实体,以及他们之间的关系,为后边的数据库逻辑结构设计打基础。这些实体包括各种具体信息,通过相互之间的作用形成数据的流动。通过Microsoft Office Visio 软件绘制出表与表之间的逻辑关系。(如图1)
在这里插入图片描述

图1 库存管理系统E-R图

经过前面的需求分析和数据库表的逻辑结构设计。系统采用Microsoft SQL Server 2000作为数据库开发工具,创建名为KunCunManage数据库,根据数据功能的实现和将来系统功能的扩展,设计如下数据项:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 系统模块分析与设计

  1. 系统登录:与一般的登录系统相似,主要是对登录用户的身份进行合法性验证。登录身份分为两种:一般用户和管理员。若为为注册用户,则需先注册后才能登录系统。
  2. 用户注册:在登录界面未注册用户通过点击注册按钮跳转到注册界面。与一般的注册流程一样,用户在注册时需检验用户名是否可用,以及密码与确认密码是否匹配。
  3. 用户管理:一般用户和管理员的权限的管理都在“用户管理”模块中,系统管理员可以查看所有合法用户的信息,有权添加、删除和修改所有合法用户的信息,一般用户没有该权限。
  4. 库存查询:系统的合法用户可以通过汇总查询查看库存中的所有信息,也可以选择种类名和货物名查看自己所想找的货物。
  5. 进货作业:由管理员输入所进货物的详细信息,在进货单中生成一条记录。此时要判断货物几种情况:(1)该货物在库存中已经存在;(2)所进的货物在库存中不存在时又分三种情况:1是在库存中有该种类和名字但没有该厂家的货物(如库存中有墨盒1,厂家为A;墨盒1,厂家B;所进货物为墨盒1,厂家C);2是在库中有该种类但没有该名字的货物(如库中有墨盒1,墨盒2,所进货物为墨盒3);3是库中没有该种类的货物。管理员在确定数据无误后,系统会根据不同的情况对不同的表进行插入和更新。
  6. 领料作业:由管理员输入所领货物的详细信息,在领货单中生成一条记录。此时要判断领出货物数量的情况:首先要判断所输入的数量是否合法(是否超出了库存数量);其次判断所领货物的数量小于和等于库存中该产品的数量。管理员在确认后,系统会根据不同的情况对不同的表进行更新和删除操作。
  7. 损坏清理:属于领料作业的子功能,系统将通过损坏的货物数量对明细表和总库存表进行更新和删除操作。
  8. 库存转库:管理员输入目的仓库后,系统将选定的货物的仓库转向目的仓库,达到调拨货物的作用。同种类的商品都分在同个仓库中,需要调库时需将所有同种类的货物进行转库,不再对同种类不同货物名的商品进行细分。
  9. 库存盘点:管理员将实际盘存的货物数量输入计算机,计算机自动与数据库中的库存数量进行核对,并产生盘盈盘亏统计信息。计算盘盈盘亏采用了教为简便的方法,即将实际盘存的货物数量与数据库中的库存数量进行相减,得到正值即为盘盈,负值为盘亏。
  10. 历史查询:用户通过输入日期,系统将列出符合该日期的数据。分为三种情况:1是只输入起始日期,则系统输出符合从起始日期开始的所有数据;2是只输入截止日期,则系统输出符合到截止日期之前包括截止日期的所有数据;3是既有起始日期也有截止日期,则系统输出满足这段时间的数据。

系统功能模块层次,如图2
在这里插入图片描述

图2 库存管理功能模块

3.3 界面设计
本系统采用蓝色基调,橙色,棕褐色,白色,红色为辅调。由于系统是基于WEB页面的,所以界面设计必须符合以完成网站可视性阅读功能为目的。
橙色具有明亮、华丽、健康、兴奋、温暖、欢乐、辉煌、以及容易动人的色感,在空气中的穿透力仅次于红色,而色感较红色更暖,最鲜明的橙色应该是色彩中感受最暖的色,能给人有庄严、尊贵、神秘等感觉,所以基本上属于心理色性。现代社会上往往作为标志色和宣传色。不过也是容易造成视觉疲劳的色。故将它用户注册界面的主色调,如图3
在这里插入图片描述

图3 注册界面
在这里插入图片描述

图4 主界面
颜色,是生物在年轻时的代表(成熟色是绿色)。在心理暗示来说,天蓝和粉红色一样,都是“安抚色”,是令人安静并放松的颜色。白色在系统中主要作为背景色,导航栏字体颜色。白色视觉度,注目度都比较高,因为白色为全色相,所以也能满足本管理系统用户心理要求,加之与蓝色配合,使整个系统更具阅读可视性,操作易用性。整个系统看起来颇大气,富有立体感。再者,白色代表纯洁、简单、洁净。如图4:
代表和谐、统一、优雅、高贵的白色,混以深思、平和的灰色,携带宁静的蓝色和充满大自然气息的棕色,这些宁静色系可以营造出舒适宽广的空间感,给人柔美、高雅与平和的感觉,整体风格清淡雅致、宁静安稳。故放在历史查询界面,调节主界面单一的色调。如图5:
在这里插入图片描述

图5 盘点表查询界面

3.4 系统流程图
用户进入系统登录页面后,输入用户名和密码,点击确定后,系统将根据用户输入的用户名和密码判断该用户是否为合法用户;如果用户输入的用户名和密码出错,系统将提示出错,并返回到登录界面;如果用户输入的用户名和密码正确,系统将根据用户的身份选择相应的主页以及功能;所有合法用户在处理完业务后,都需要进行退出登录,以免被他人窃取信息。退出后,将返回到登录界面。如图6:
在这里插入图片描述

4 库存管理系统功能模块的具体实现
4.1 系统主要功能模块的实现及部分代码
4.1.1 用户注册和登录界面
在用户注册时首先检测该用户注册的用户名是否可用,即检查数据库该用户名是否已经存在,代码如下:

ConnectionSQL sqlcon1 = new ConnectionSQL();
        string User;
        User = TextBox1.Text.Trim();
   SqlDataReader UserReader = sqlcon1.SqldataReader("select *from ADMIN_LIST where UserId='" + User + "'");
        if (UserReader.Read())
        {
            Label5.Text = "该用户名已经被使用,请重新注册";
        }
        else 
        {
            Label5.Text = "该用户名可以使用";
        }

检测完后,再判断注册用户输入的密码是否为空,若为空,则弹出“密码不能为空”的对话框;若不为空,则检测注册用户输入的密码与确认密码是否吻合,代码如下:

 if (Password =="")
            {
                    HttpContext.Current.Response.Write("<script>alert('密码不能为空!');window.location.href='Registration.aspx'</script>");
               
            }
           
            else
            {
                if (Password != Surepassword)
                {
                    HttpContext.Current.Response.Write("<script>alert('确认密码与密码不匹配,请重新输入!');window.location.href='Registration.aspx'</script>");

                }
                else
                {
                    sqlcon.Sqldataset("insert ADMIN_LIST(UserId,Password,Jurisdiction)values('" + User + "','" + Password + "','1')");
                    HttpContext.Current.Response.Write("<script>alert('恭喜,用户注册成功!');window.location.href='Admin.aspx'</script>");
                    // Label4.Text = "恭喜,用户注册成功,请点击返回登录";
                    TextBox1.Text = null;
                }
             }

对于密码过长的限制,在前台使用了RegularExpressionValidator验证控件,通过输入.{0,10}表达式,将密码长度限制在10个字符以下。
在用户登录界面,除了对用户名与密码的合法性验证外,还要将管理员权限的值赋给Session[“Right”]这个全局变量,目的是为了以后方便对用户权限的判断。具体代码如下:

User = TextBox1.Text.Trim();
        PassWord = TextBox2.Text.Trim();
        SqlDataReader UserReader = skycon1.SqldataReader("select * from ADMIN_LIST where UserId='" + User + "' and Password='" + PassWord + "'");
        if (UserReader.Read())
        {
            if (UserReader.GetString(2).Trim()=="2")
            {
                Session["Right"]= "2";
            }
            HttpContext.Current.Response.Write("<script>alert('登录成功!');window.location.href='Admin.aspx'</script>");
            UserReader.Close();
        }
        else
        {
            Label3.Text = "你输入的用户名和密码不正确,请重新输入";
            UserReader.Close();
        }

4.1.2 进货作业
进货作业是库存管理系统中最为重要的模块之一,上面的模块设计中已经分析了进货作业中存在的几种情况,除此之外,系统还要判断管理员是否出现输入有误现象。如输入的种类号与种类名不相符时,货物号与货物名不相符合时,系统都应该报错,但这两种出现的几率不是很大,为了减轻服务器负担,并没有把这些判断加入到系统中,只是对管理员输入时进行默认,认为输入的对应的货物种类和名称都是相符合的。当输入的仓库号与货物所属仓库不一致时(同种类的货物都存放在一个仓库中),由于此类错误出现的几率很大,所以在系统中加入了判断,如出现错误,则系统弹出“您输入的仓库号与物品仓库号不符合,请重新输入”的对话框。对与管理员输入的进货数量,进货价的合法性判断都采用了RegularExpressionValidator验证控件进行判断,以减少后台的操作。具体代码如下:

DataSet dt1 = skycon1.Sqldataset("select *from GOODS_DETAIL where HuoWuId='" + HuoWuId + "' and BusinessId='" + BusinessId + "'");
        if (dt1.Tables[0].Rows.Count != 0)//当该物品在明细表中已经存在时:
        {          
            DataSet dt2 = skycon1.Sqldataset("select *from GOODS_LIST where TypeId='" + TypeId+"'");//GooddataRow["TypeId"].ToString() 
            if (dt2.Tables[0].Rows.Count != 0)
            {
                DataRow GooddataRow1 = dt2.Tables[0].Rows[0];            
                //判断仓库号
                if (StoreHouseId != GooddataRow1["StoreHouseId"].ToString().Trim())
                {
                    HttpContext.Current.Response.Write("<script>alert('您输入的仓库号与物品仓库号不符合,请重新输入!');window.location.href='Enter.aspx'</script>");
                }
                else
                {
                    skycon1.SqlExcute("insert JINHUO_LIST(HuoWuId,HuoWuName,TypeId,JinHuoSiQty,EnterPrice,EnterTotalPrice,StoreHouseId,BusinessId,DateTime)values('" + HuoWuId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + "," + EnterTotalprice.ToString() + ",'" + StoreHouseId + "','" + BusinessId + "','" + Datetime + "')");
                    DataRow GooddataRow = dt1.Tables[0].Rows[0];
                    SiQtyG = (int)GooddataRow["SiQty"] + JinhuoSiQty;
                    EnterPriceG = ((decimal)GooddataRow["EnterPrice"] * (int)GooddataRow["SiQty"] + EnterTotalprice) / ((int)GooddataRow["SiQty"] + JinhuoSiQty);
                    skycon1.SqlExcute("update GOODS_DETAIL set SiQty=" + SiQtyG.ToString() +     ",EnterPrice=" + EnterPriceG.ToString() + "where HuoWuId='" + HuoWuId + "' and      BusinessId='" + BusinessId + "'");
                    //更新细表    	               
                    int SiQtyG1 = (int)GooddataRow1["SiQty"] + JinhuoSiQty;
                    decimal StorePrice = (decimal)GooddataRow1["StorePrice"] + EnterTotalprice;
                    skycon1.SqlExcute("update GOODS_LIST set SiQty=" + SiQtyG1.ToString() + ",StorePrice=" + StorePrice.ToString() + "where TypeId='" + TypeId + "'");//GooddataRow["TypeId"].ToString() 
                    //更新总表
                    HttpContext.Current.Response.Write("<script>alert('恭喜您的操作已成功!');window.location.href='Enter.aspx'</script>");
                }
            }
            else
            {
                HttpContext.Current.Response.Write("<script>alert('您输入的货物种类和和货物不相符,请重新输入!');window.location.href='Enter.aspx'</script>");
            }
        }
        else    
        {

            //如果是同种类不同名字的或不同产家的货物则执行下列步骤;
            DataSet dt4 = skycon1.Sqldataset("select *from GOODS_LIST where TypeId='" + TypeId + "'");
            DataSet dt5 = skycon1.Sqldataset("select *from GOODS_DETAIL where HuoWuId='" + HuoWuId + "'");
            if(dt4.Tables[0].Rows.Count!=0)
            {       
                
                if (dt5.Tables[0].Rows.Count != 0)//同种类同名但没有该厂家的货物
                {
                                       
                    DataRow GooddataRow = dt4.Tables[0].Rows[0];
                    int SiQtyG2 = (int)GooddataRow["SiQty"] + JinhuoSiQty;
                    decimal StorePrice1 = (decimal)GooddataRow["StorePrice"] + EnterTotalprice;
                    if (StoreHouseId != GooddataRow["StoreHouseId"].ToString().Trim())//判断仓库号
                    {
                        HttpContext.Current.Response.Write("<script>alert('您输入的仓库号与物品仓库号不符合,请重新输入!');window.location.href='Enter.aspx'</script>");
                    }
                    else
                    {
                        skycon1.SqlExcute("insert JINHUO_LIST(HuoWuId,HuoWuName,TypeId,JinHuoSiQty,EnterPrice,EnterTotalPrice,StoreHouseId,BusinessId,DateTime)values('" + HuoWuId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + "," + EnterTotalprice.ToString() + ",'" + StoreHouseId + "','" + BusinessId + "','" + Datetime + "')");
                     skycon1.SqlExcute("insert GOODS_DETAIL(HuoWuId,BusinessId,HuoWuName,TypeId,SiQty,EnterPrice)values('" + HuoWuId + "','" + BusinessId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + ")");  
                        skycon1.SqlExcute("update GOODS_LIST set SiQty=" + SiQtyG2.ToString() + ",StorePrice=" + StorePrice1.ToString() + "where TypeId='" + TypeId + "'");
                        HttpContext.Current.Response.Write("<script>alert('恭喜您的操作已成功!');window.location.href='Enter.aspx'</script>");
                    }
                }
                else//同种类没有该名字的货物
                {
                    DataRow GooddataRow = dt4.Tables[0].Rows[0];
                    int SiQtyG3 = (int)GooddataRow["SiQty"] + JinhuoSiQty;
                    decimal StorePrice1 = (decimal)GooddataRow["StorePrice"] + EnterTotalprice;
                    if (StoreHouseId != GooddataRow["StoreHouseId"].ToString().Trim())//判断仓库号
                    {
                        HttpContext.Current.Response.Write("<script>alert('您输入的仓库号与物品仓库号不符合,请重新输入!');window.location.href='Enter.aspx'</script>");
                    }
                    else
                    {
                        skycon1.SqlExcute("insert JINHUO_LIST(HuoWuId,HuoWuName,TypeId,JinHuoSiQty,EnterPrice,EnterTotalPrice,StoreHouseId,BusinessId,DateTime)values('" + HuoWuId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + "," + EnterTotalprice.ToString() + ",'" + StoreHouseId + "','" + BusinessId + "','" + Datetime + "')");
                        skycon1.SqlExcute("insert GOODS_DETAIL(HuoWuId,BusinessId,HuoWuName,TypeId,SiQty,EnterPrice)values('" + HuoWuId + "','" + BusinessId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + ")");
                        skycon1.SqlExcute("insert GOODSNAME_LIST(HuoWuId,HuoWuName)values('" + HuoWuId + "','" + HuoWuName + "')");
                        skycon1.SqlExcute("update GOODS_LIST set SiQty=" + SiQtyG3.ToString() + ",StorePrice=" + StorePrice1.ToString() + "where TypeId='" + TypeId + "'");
                        HttpContext.Current.Response.Write("<script>alert('恭喜您的操作已成功!');window.location.href='Enter.aspx'</script>");
                   }
                }
            }
            else  //如果是新种类的货物,则执行下列步骤;
            {
                        skycon1.SqlExcute("insert JINHUO_LIST(HuoWuId,HuoWuName,TypeId,JinHuoSiQty,EnterPrice,EnterTotalPrice,StoreHouseId,BusinessId,DateTime)values('" + HuoWuId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + "," + EnterTotalprice.ToString() + ",'" + StoreHouseId + "','" + BusinessId + "','" + Datetime + "')");
                        skycon1.SqlExcute("insert GOODS_LIST(TypeName,TypeId,SiQty,StoreHouseId,StorePrice)values('"+TypeName+"','"+TypeId+"','"+JinhuoSiQty.ToString()+"','"+StoreHouseId+"','"+EnterTotalprice.ToString()+"')");
                         skycon1.SqlExcute("insert GOODS_DETAIL(HuoWuId,BusinessId,HuoWuName,TypeId,SiQty,EnterPrice)values('" + HuoWuId + "','" + BusinessId + "','" + HuoWuName + "','" + TypeId + "'," + JinhuoSiQty.ToString() + "," + EnterPrice.ToString() + ")");
                        skycon1.SqlExcute("insert GOODS_TYPES(TypeId,TypeName)values('" + TypeId + "','" + TypeName + "')");
                        skycon1.SqlExcute("insert GOODSNAME_LIST(HuoWuId,HuoWuName)values('" + HuoWuId + "','" + HuoWuName + "')");
                        HttpContext.Current.Response.Write("<script>alert('恭喜您的操作已成功!');window.location.href='Enter.aspx'</script>");
            }
          }

4.1.3 库存盘点
库存盘点是库存管理中相对较为关键的一环,由于专业知识所限,这个模块功能不是很全面,盘盈和盘亏的计算是通过将实际盘存的货物数量与数据库中的库存数量进行相减,得到正值即为盘盈,负值为盘亏。代码如下:

if (PanDianSiQty >= StoreSiQty)
            {
                PanY = OutPrice * (PanDianSiQty - (int)DataGoodDetail["SiQty"]);
                sqlcon1.SqlExcute("insert PanDian_LIST(HuoWuId,HuoWuName,BusinessId,PanDianSiQty,StoreSiQty,OutPrice,PanY,DateTime)values('" + HuoWuId +
                "','" + HuoWuName + "','" + BusinessId + "'," + PanDianSiQty.ToString() + "," + StoreSiQty.ToString() + "," + OutPrice.ToString() + "," + PanY + ",'" + Datetime + "')");
                TextBox3.Text = PanY.ToString();
                TextBox4.Text = null;
            }
            else
            {
                PanK = OutPrice * ((int)DataGoodDetail["SiQty"] - PanDianSiQty);
                sqlcon1.SqlExcute("insert PanDian_LIST(HuoWuId,HuoWuName,BusinessId,PanDianSiQty,StoreSiQty,OutPrice,PanK,DateTime)values('" + HuoWuId +
               "','" + HuoWuName + "','" + BusinessId + "'," + PanDianSiQty.ToString() + "," + StoreSiQty.ToString() + "," + OutPrice.ToString() + "," + PanK + ",'" + Datetime + "')");
                TextBox4.Text = PanK.ToString();
                TextBox3.Text = null;
            }

4.2系统实现的关键技术
4.2.1 数据库的连接技术
过去,通过ADO的数据存取采用了两层的基于连接的编程模型。随着多层应用的需求不但增加,程序员需要一个无连接的模型。ADO.NET就应运而生了。ADO.NET的Managed Provider就是一个多层结构的无连接的一致的编程模型。Managed Provider提供了DataSet和数据中心(如MS SQL)之间的联系。Managed Provider包含了存取数据中心(数据库)的一系列接口。主要有三个部件:(1)连接对象Connection、命令对象Command、参数对象Parameter提供了数据源和DataSet之间的接口。DataSetCommand接口定义了数据列和表映射,并最终取回一个DataSet。(2)数据流提供了高性能的、前向的数据存取机制。通过IdataReader,你可以轻松而高效地访问数。(3)更底层的对象允许你连接到数据库,然后执行数据库系统一级的特定命令。

过去,数据处理主要依赖于两层结构,并且是基于连接的。连接断开,数据就不能再存取。现在,数据处理被延伸到三层以上的结构,相应地,程序员需要切换到无连接的应用模型。这样,DataSetCommand就在ADO.NET中扮演了极其重要的角色。它可以取回一个DataSet,并维护一个数据源和DataSet之间的“桥”,以便于数据访问和修改、保存。DataSetCommand自动将数据的各种操作变换到数据源相关的合适的SQL语句。从图上可以看出,四个Command对象:SelectCommand、InsertCommand、UpdateCommand、DeleteCommand分别代替了数据库的查询、插入、更新、删除操作。

为了方便系统调用数据库连接,减少后台代码量,提高连接效率。我们把几个常用的方法都封装在ConnectionSQL这个类里面,以下是连接数据库代码:

public class ConnectionSQL:System.IDisposable
{
    private SqlConnection sqlcon1=null;
    public ConnectionSQL()
    {
      sqlcon1=new SqlConnection("server=localhost;uid=sa;pwd=;database=KuCunManage");
        //		// TODO: 在此处添加构造函数逻辑		//
    }
    public int SqlExcute(string s1) // 返回一个BOOL值		//
    {
        try
        {
            int i;
            if(sqlcon1.State==ConnectionState.Closed)
            sqlcon1.Open();
            SqlCommand com1 = new SqlCommand(s1,sqlcon1);
            i=com1.ExecuteNonQuery();
            return i;            
        }
        finally
        {
            sqlcon1.Close();
        }
        
}

    public SqlDataReader SqldataReader(string s1)
    {
        try
        {
            if (sqlcon1.State == ConnectionState.Closed)
            sqlcon1.Open();       
            SqlDataReader read1;
            SqlCommand com1 = new SqlCommand(s1, sqlcon1);
            read1 = com1.ExecuteReader();
            return read1;
        }
        finally
        {    
        }
}

    public DataSet Sqldataset(string s1) // 返回第一张表	//
    {
        try
        {
            if (sqlcon1.State == ConnectionState.Closed)
                sqlcon1.Open();
            SqlDataAdapter Sqlada1 = new SqlDataAdapter(s1, sqlcon1);
            DataSet dt1 = new DataSet();
            Sqlada1.Fill(dt1, "table1");
            return dt1;
        }
        finally
        {
            sqlcon1.Close();
        }
    }
     //销毁对象;

    public virtual void Dispose(bool flag) 
    {
        if (flag == true)
        {
            sqlcon1.Close();
        }
        sqlcon1 = null;
    }
    public void Dispose()
    {
        GC.SuppressFinalize(true);
        this.Dispose(true);
    }
 }

5 系统功能的测试与分析
5.1 用户注册功能测试与分析
未注册用户在登录界面中点击“注册”,然后系统跳转到注册界面,在注册界面中未注册用户在“用户名”栏中填入“qq”,点击“检测该用户名是否可用”按钮,系统显示该“用户名可以使用”,说明这个用户与系统用户名没有重复,可以使用。然后输入密码“123”与确认密码“123”,最后按“确定”,这时候在系统中就生成了一个名为“qq”的用户。操作如图7:
在这里插入图片描述

图7 用户注册操作
然后我们我们通过“xujue”这个最高级管理员进入系统,查看该注册用户的信息。进入用户管理页面后,我们点击“显示一般用户”按钮,则显示如图8:
在这里插入图片描述

图8 一般用户显示
我们现在想把“qq”用户的管理权限提升为“2”,即让他成为管理员。我们点击“编辑”,然后在权限栏中将“1”改为“2”,这时候我们点击显示管理员:如图9:
在这里插入图片描述

图9 管理员显示
让我们重新返回登录界面,此时我们以“qq”的身份进入系统,验证成功,系统弹出“登录成功”的对话框,点击“确定”,这时候就进入了系统。如图10、图11:
在这里插入图片描述

在这里插入图片描述

5.2 进货作业功能测试与分析
我们通过管理员身份登录系统,然后进入进货作业界面,在对应的栏中我们分别填入货物号:“01”、货物种类号:“1”、货物名:“墨盒1”、种类名:“墨盒”、进货数量:“10”、进货价:“45.6”、仓库号:“1”、厂家号:“A”。如图12:
在这里插入图片描述

图12 输入进货信息
然后点击“确定”,系统弹出“进货成功”信息,此时系统就向进货单中添加了一条记录。我们可以通过库存查询功能来查看相应的信息。(图13 、图14)
在这里插入图片描述

图13 进货后库存总信息
在这里插入图片描述

图14 进货后货物明细表中的信息
当我们将仓库号改变,将“1”改为“2”,其他信息与上次相同,再次进行进货作业时,系统会弹出“您输入的仓库号与货物仓库号不符合,请重新输入”对话框,因为我们前面定义了同种类的货物只能放在一个仓库中,当输入的仓库号不符时,系统会报错。如图15:

在这里插入图片描述

图15 仓库号输入有误信息
5.3 库存盘点功能测试与分析
我们进入库存盘点页面,这时候货物明细表中墨盒1的数量为“30”,出售价格为“50”在货物名下拉菜单中选择“墨盒1”,厂家名中输入“A”。

  1. 当我们输入数量为31时,点击确定后显示盘盈“50”元。显示如图16:
    在这里插入图片描述

图16 盘盈信息
2) 当我们输入盘点数量为28时,点击确定后系统显示盘亏:“100”元,如图17:
在这里插入图片描述

图17 盘亏信息
3) 当我们重新选择“墨盒1”,但是输入的厂家为“B”时,由于明细表中墨盒1的厂家没有为“B”的,系统将提示“没有您所输入厂家的物品,请重新输入”如图18:
在这里插入图片描述

结 论
省略

参考文献
[1] 王俊伟,史创明. SQL Server 2000 数据库管理与应用 [M].北京:清华大学出版社,2006。
[2] 徐国智,汪孝宜. SQL Server 数据库开发实例精粹 [M]. 北京:电子工业出版社,2006。
[3] 王黯,马里杰. SQL Server 数据库开发经典案例解析 [M].北京:清华大学出版社,2006。
[4] 方睿. 网络数据库原理及应用 [M]. 成都:四川大学出版社,2005。
[5] 黄忠成. 深入剖析ASP.NET组件设计[M].北京:电子工业出版社,2005。
[6] Mickey Williams[美].Visual C# .NET技术内幕[M].北京:清华大学出版社,2004。
[7] 吉根林,崔海源. ASP.NET程序设计教程 [M].北京:电子工业出版社,2004。
[8] 金雪云. ASP.NET简明教程 [M].北京:清华大学出版社,2003。
致 谢
省略


5、资源下载

本项目源码及完整论文如下,有需要的朋友可以点击进行下载。如果链接失效可点击下方卡片扫码自助下载。

序号毕业设计全套资源(点击下载)
本项目源码基于C#+c+sqlserver的办公耗材库存管理软件设计与实现(源码+文档)_C#_BS架构_库存管理软件.zip
  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毕业设计方案专家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值