340 likes | 495 Views
基于 C# 的 SQL Server 应用开发. 学习情境 Ⅰ: 子 学习情境 七 测试数据库. 工作任务 21 编写程序代码. 做什么. 设计网络商城相应模块。. 怎么做. 针对网络商城系统所包括的七大功能 — 系统登录、商品查找、商品分类列表、最欢迎商品、商品详细信息、购物车和订单查询,分别设计相应程序模块。 为网络商城系统所包括的七大功能模块 — 系统登录模块、商品查找模块、商品分类列表模块、最欢迎商品模块、商品详细信息模块、购物车模块和订单查询模块,分别编写相应程序代码。. 准备做. 展示网络商城的案例. 动手做.
E N D
基于C#的SQL Server应用开发 学习情境Ⅰ:子学习情境七测试数据库 工作任务21 编写程序代码
做什么 设计网络商城相应模块。
怎么做 针对网络商城系统所包括的七大功能—系统登录、商品查找、商品分类列表、最欢迎商品、商品详细信息、购物车和订单查询,分别设计相应程序模块。 为网络商城系统所包括的七大功能模块—系统登录模块、商品查找模块、商品分类列表模块、最欢迎商品模块、商品详细信息模块、购物车模块和订单查询模块,分别编写相应程序代码。
准备做 展示网络商城的案例
动手做 实施工作任务设计应用系统的程序模块: 步骤: ① 设计系统功能模块 网络商城系统的功能模块主要分为以下几个部分: 系统登录模块 商品查找模块 商品分类列表模块 最受欢迎商品模块 商品详细信息模块 购物车模块 订单查询模块 ② 设计系统登录模块 1、系统登录模块主要实现验证用户身份的功能,因此主要响应用户提交输入信息的事件,即“登录”按钮的单击事件。该模块调用存储过程UserLogin来完成用户的身份验证: ALTER Procedure UserLogin ( @UserName nvarchar(16), @Password nvarchar(12),
动手做 @UserID int OUTPUT ) AS SELECT @UserID = UserID FROM [StoreOnline].[dbo].[User] WHERE UserName = @UserName AND Password = @Password IF @@Rowcount < 1 SELECT @UserID = 0 Userlogin存储过程定义参数@UserName,@Password和@UserID。其中,@UserName和@Pssword这两个参数用来接收输入的用户名和密码,@UserID参数作为输出参数。 2、登录功能的实现过程首先调用StoreOnline.cs文件中的GetShoppingCartId()函数。该函数用来获取用户正在使用的购物车信息 3、获取用户的购物车信息以后,就可以使用存储过程UserLogin获取登录用户的信息。当用户登录有效时,取得数据库中该用户的Userid,然后使用GetUserDetails(userid)函数取得该用户的详细信息。
动手做 4、为了从数据库中获取会员的所有信息,该代码片断调用了UserInfo存储过程。该存储过程用于从会员信息表(User)中读取所有的信息。 ALTER Procedure UserInfo ( @UserID int, @UserName nvarchar(16) OUTPUT, @Password nvarchar(12) OUTPUT, @Name nvarchar(10) OUTPUT, @Email nvarchar(50) OUTPUT, @IDCardNumber nvarchar(18) OUTPUT, @TelephoneNumber nvarchar(12) OUTPUT, @Address nvarchar(50) OUTPUT, @ZoneCode nvarchar(10) OUTPUT, @Mobilephone nvarchar(12) OUTPUT, @Oicq nvarchar(20) OUTPUT, @MSN nvarchar(50) OUTPUT ) AS
动手做 SELECT @UserName = UserName, @Password = Password, @Name = Name, @Email = Email, @IDCardNumber = IDCardNumber, @TelephoneNumber = TelephoneNumber, @Address = Address, @ZoneCode = ZoneCode, @Mobilephone = Mobilephone, @Oicq = Oicq, @MSN =MSN FROM [StoreOnline].[dbo].[User] WHERE UserID = @UserID 从数据库中获取所有的信息之后,定义myUserDetails对象为UserDetails类,并根据存储过程的输出参数的值对myUserDetails对象进行赋值。GetUserDetails(userid)函数返回
动手做 myUserDetails对象。 5、通过GetUserDetails(userid)函数获取用户名写入到Cookies("Store_UserName"),然后把用户名称添加到身份认证凭据中,完成登录过程。 ③ 设计商品查找模块 1、商品查找模块主要包括一个Search控件和一个查询结果页面。Search控件主要记录用户要查询的条件。 2、查找结果页面中的DataList控件绑定所查询到的结果。该页面加载时就把查找到的数据结果绑定到DataList控件。 3、以用户输入的商品的查询条件为参数,使用函数SearchProDescriptions()查找数据库中的商品信息,该函数在文件StoreOnline.cs中。 SearchProDescriptions()函数用于查找商品,调用了SearchPro存储过程。 ALTER Procedure SearchPro ( @ProName nvarchar(255), @CatID int ) AS SELECT
动手做 ProID, CatID, ProName, ProPrice, ProImages FROM Products WHERE ProName Like '%'+ @ProName +'%' AND CatID =@CatID 在SearchPro存储过程中使用了模糊查询,查找该分类中的类似名称的商品。使用.ExecuteReader命令进行查询,返回结果result。 4、把通过SearchProDescriptions()函数获得的数据绑定到DataList控件上,页面加载时就可以显示查询到的结果。 ④ 设计商品分类列表模块 1、商品分类模块嵌套于首页页面,用来显示所有的商品分类信息,因此该控件后台代码
动手做 主要是响应页面加载时绑定商品分类信息。 2、商品分类列表功能的原理是首先设置DataList的当前选择值selection,然后创建数据库连接对象,并打开该数据库连接,执行数据库操作命令,在该命令中使用ListProCategory存储过程,最后把读取到的结果绑定到DataList控件。 ALTER Procedure ListProCategory AS SELECT CatID, CatName FROM Categories ORDER BY CatName ASC ⑤ 设计最受欢迎商品模块 1、最受欢迎商品模块同商品分类列表模块类似,主要在页面加载的时候把从数据库中获取的数据绑定到DataList控件,向用户展示销量最好的商品。 2、页面中的DataList控件加载的数据源是通过GetMostSoldProducts()函数获得的。该函数位于StoreOnline.cs文件中。
动手做 3、该函数处理数据库的命令对象使用Sql命令的操作类型是存储过程。该存储过程为MostSoldProducts的详细代码如下: ALTER Procedure MostSoldProducts AS SELECT TOP 6 OrderContent.ProID, SUM(OrderContent.ProQuantity) as TotalNum, Products.ProName, Products.ProImages, Products.ProPrice FROM OrderContent INNER JOIN Products ON OrderContent.ProID = Products.ProID GROUP BY OrderContent.ProID, Products.ProName, Products.ProImages, Products.ProPrice
动手做 ORDER BY TotalNum DESC MostSoldProducts存储过程使用Products表和OrderContent表,读者还可以根据个人喜好设定更加吸引顾客的信息。 ⑥ 设计商品详细信息模块 1、商品详细信息模块主要响应页面加载时数据绑定到控件的事件。 2、页面加载时通过读取StoreOnline.cs文件中的GetProDetails()函数获取商品的详细信息。 3、根据用户选择的商品编号从数据库中读取商品的详细信息。该读取过程使用ProDetail存储过程,其详细代码如下: ALTER Procedure ProDetail ( @ProID int, @ProMarketPrice money OUTPUT, @ProName nvarchar(50) OUTPUT, @ProImages nvarchar(50) OUTPUT, @ProPrice money OUTPUT, @ProIntro nvarchar(4000) OUTPUT )
动手做 AS SELECT @ProID = ProID, @ProMarketPrice = ProMarketPrice, @ProName = ProName, @ProImages = ProImages, @ProPrice = ProPrice, @ProIntro = ProIntro FROM Products WHERE ProID = @ProID PorDetail存储过程选择商品编号同参数@ProID得到的数值相同的商品信息。获取商品信息以后,就可以把这些信息绑定到各个控件上。 ⑦ 设计购物车模块 1、购物车模块是网络商城系统的一个主要模块。该模块主要包括以下几个文件。 AddToCart.aspx文件 ShoppingCart.aspx文件
动手做 CheckOut.aspx文件 2、用户把商品放入购物车首先进入AddToCart页面进行购物车的前提准备。 3、当用户把商品放入购物车后,就调用StoreOnline.cs文件中的GetShoppingCartId()函数来获取购物车信息。然后调用AddItemtoShoppingCart()函数把商品加入该购物车,并定位到购物车页面。 4、AddItemtoShoppingCart()函数的功能是使用AddItemtoShoppingCart存储过程向数据库中插入一条新的记录。 ALTER Procedure AddItemtoShoppingCart ( @CartIDString nvarchar(50), @ProID int, @ProQuantity int ) As DECLARE @CountItems int SELECT @CountItems = Count(ProID) FROM
动手做 ShopCart WHERE ProID = @ProID AND CartIDString = @CartIDString IF @CountItems > 0 UPDATE ShopCart SET ProQuantity = (@ProQuantity + ShopCart.ProQuantity) WHERE ProID = @ProID AND CartIDString = @CartIDString ELSE INSERT INTO ShopCart ( CartIDString,
动手做 PRoQuantity, ProID ) VALUES ( @CartIDString, @ProQuantity, @ProID ) AddItemtoShoppingCart存储过程首先从ShopCart信息表中获取用户所购商品的数量。如果数量大于0,则更新该条记录,否则向该信息中插入一条新的记录。 5、购物车页面主要向用户展示购物车中商品的信息,页面加载时,绑定登录用户的所有购物信息,如果没有登录则进入登录页面。页面加载时使用PopulateShoppingCartList()函数把购物车中的信息绑定到DataList控件。 6、PopulateShoppingCartList()函数首先通过GetShoppingCartId()函数获取购物车的标识,并通过CountShoppingCartItem()函数判断购物车中商品的数量,如果数量为0,则不显示购物车信息,并显示提示信息,否则,使用DisplayShoppingCart()函数获取购物车信息并把该信息绑定到DataGrid控件。 7、CountShoppingCartItem()函数通过CountShoppingCartItem存储过程获取购物
动手做 车内商品的数量,并返回该数值。 ALTER Procedure CountShoppingCartItem ( @CartIDString nvarchar(50), @ItemCount int OUTPUT ) AS SELECT @ItemCount = COUNT(ProID) FROM ShopCart WHERE CartIDString = @CartIDString 该存储过程使用COUNT()函数来计算某件商品的总数,并返回该信息值。 8、当获取购物数量大于0时,就使用DisplayShoppingCart()函数获取购物车中商品的信息。 9、DisplayShoppingCart()函数通过操作DisplayShoppingCart存储过程获取购物车中的商品信息。
动手做 ALTER Procedure DisplayShoppingCart ( @CartID nvarchar(50) ) AS SELECT Products.ProID, Products.ProName, Products.ProMarketPrice, ShopCart.ProQuantity, Products.ProPrice, Cast((Products.ProPrice * ShopCart.ProQuantity) as money) as ExtendedAmount FROM Products, ShopCart WHERE Products.ProID = ShopCart.ProID
动手做 AND ShopCart.CartIDString = @CartID ORDER BY Products.ProName, Products.ProMarketPrice DisplayShoppingCart存储过程中ExtendedAmount变量是商品价格和商品数量乘积所得的商品总价格,用来绑定到DataGrid控件的“小计”栏中。 10、当用户更改购物车中商品的数量或者删除商品以后,单击“更新购物车”按钮则响应购物车的事件,该事件主要包括UpdateShoppingCartDatabase()和PopulateShoppingCartList()两个函数。 11、UpdateShoppingCartDatabase()该函数首先通过GetShoppingCartId()函数获取购物车标识,并获取DataGrid控件中所包含的项目数量,根据该数量来控制一个循环过程,该循环使用for循环语句完成。接着,获取DataGrid控件中TextBox控件和CheckBox控件的信息。如果某种商品的数量改变了或者删除该商品的Check控件被选择了,那么调用相应的方法更新数据库。删除商品使用ShoppingCartRemoveItem()函数。 12、删除商品函数中调用了RemoveShoppingCartItem存储过程。 ALTER Procedure RemoveShoppingCartItem ( @CartIDString nvarchar(50),
动手做 @ProID int ) AS DELETE FROM ShopCart WHERE CartIDString = @CartIDString AND ProID = @ProID RemoveShoppingCartItem存储过程相对比较简单,只是从ShopCart信息表中删除商品编号和购物车标识都对应的数据记录。 13、更新购物车中商品的数量使用的是ShoppingCartUpdate()函数。该函数传递购物车中某件商品的数量。 14、ShoppingCartUpdate()该函数首先判断用户输入的数值是否有效,当输入数据为负数则显示错误信息,否则执行更新数据库操作。该函数更新数据库时调用UpdateShoppingCart存储过程。 ALTER Procedure UpdateShoppingCart ( @CartIDString nvarchar(50),
动手做 @ProID int, @ProQuantity int ) AS UPDATE ShopCart SET ProQuantity = @ProQuantity WHERE CartIDString = @CartIDString AND ProID = @ProID UpdateShoppingCart存储过程的作用是修改购物车中商品的数量。 15、用户单击 “最终结算”按钮。如果购物数量不等于0,则进入购物结算页面,否则,显示错误提示。 至此,购物车的基本功能已经全部实现。 16、结算页面主要向用户确认由用户提交的购物信息。在页面加载时要将用户的全部购物信息显示给用户。 17、首先获取购物车标识,然后通过DisplayShoppingCart()函数获取该购物车上的商品
动手做 信息并绑定到DataGrid控件,通过ShoppingCartTotalCost()函数计算本次购物的消费总额,并显示到Label控件上。 18、ShoppingCartTotalCost()函数调用ShoppingCartTotalCost存储过程: ALTER Procedure ShoppingCartTotalCost ( @CartIDString nvarchar(50), @TotalCost money OUTPUT ) AS SELECT @TotalCost = SUM(Products.ProPrice * ShopCart.ProQuantity) FROM ShopCart, Products WHERE ShopCart.CartIDString = @CartIDString AND Products.ProID = ShopCart.ProID
动手做 ShoppingCartTotalCost存储过程通过SUM函数计算购物的消费总额,并通过参数@TotalCost输出该信息。 19、当用户单击“提交”按钮以后将显示用户所下的订单编号。 20、当用户下达订单成功后,将通过PlaceOrder()函数将购物信息写入订单信息表和订单详细信息表中。Place Order()函数通过调用AddOrder存储过程向信息表中插入一条新的记录。 ALTER Procedure AddOrder ( @UserID int, @CartIDString nvarchar(50), @OrderDate datetime, @OrderID int OUTPUT ) AS BEGIN TRAN OrderAdd /* Create the Order header */ INSERT INTO Orders (
动手做 UserID, OrderDate ) VALUES ( @UserID, @OrderDate ) SELECT @OrderID = @@Identity INSERT INTO OrderContent ( OrderID, ProID, ProQuantity, UnitCost ) SELECT
动手做 @OrderID, ShopCart.ProID, ProQuantity, Products.ProPrice FROM ShopCart INNER JOIN Products ON ShopCart.ProID = Products.ProID WHERE CartIDString = @CartIDString EXEC EmptyShoppingCart @CartIDString COMMIT TRAN OrderAdd AddOrder存储过程比较复杂,但并不难理解。首先根据参数传入的数据向Order信息表中插入一条记录,接着向OrderContent信息表中插入一条记录并清空购物车。该存储过程使用EmptyShoppingCart存储过程。 ALTER Procedure EmptyShoppingCart ( @CartIDString nvarchar(50) )
动手做 AS DELETE FROM ShopCart WHERE CartIDString = @CartIDString EmptyShoppingCart存储过程的主要作用是从ShopCart信息表中删除该购物车标识的记录。 至此,购物车的全部功能已经实现。 ⑧ 设计订单查询模块 1、通过订单查询模块,用户可以方便地查找所有的订单信息。查找订单信息的前提是会员必须已经登录,否则将进入登录页面。 2、订单查询模块包括OrderList.aspx和OrderDetails.aspx两个文件,即订单列表页面和订单详细信息页面。 3、订单列表页面加载时实现数据的绑定。 4、订单列表页面加载时通过GetUserOrders()函数获取订单信息,并绑定到DataGrid控件。GetUserOrders()函数包含在StoreOnline.cs文件中。GetUserOrders()函数通过调用ListOrders存储过程完成数据的读取工作。 ALTER Procedure ListOrders (
动手做 @UserID int ) As SELECT Orders.OrderID, Cast(sum(OrderContent.ProQuantity*OrderContent.unitcost) as money) as OrderTotalCost, Orders.OrderDate FROM Orders INNER JOIN OrderContent ON Orders.OrderID = OrderContent.OrderID GROUP BY UserID, Orders.OrderID, Orders.OrderDate HAVING Orders.UserID = @UserID ListOrders存储过程调用Orders信息表和OrderContent信息表中关于订单的信息。
动手做 5、订单详细信息页面中的数据绑定同订单列表页面中的绑定原理类似。订单详细信息页面加载时通过GetOrderDetails()函数获取数据库中订单的详细信息,并绑定到DataGrid控件上。为了使用GetOrderDetails()函数,要先定义OrderDetails类。 6、在定义OrderDetails类后就可以在函数GetOrderDetails()中使用。 7、GetOrderDetails()函数调用OrdersDetail存储过程获取订单的详细信息,把所获取的信息填充到DataSet数据集中,并利用存储过程的参数给OrderDetails类的对象myOrderDetails赋值。 ALTER Procedure OrdersDetail ( @OrderID int, @UserID int, @OrderDate datetime OUTPUT, @OrderTotalCost money OUTPUT ) AS SELECT @OrderDate = OrderDate FROM
动手做 Orders WHERE OrderID = @OrderID AND UserID = @UserID IF @@Rowcount = 1 BEGIN SELECT @OrderTotalCost = Cast(SUM(OrderContent.ProQuantity * OrderContent.UnitCost) as money) FROM OrderContent WHERE OrderID= @OrderID SELECT Products.ProID, Products.ProName, Products.ProMarketPrice,
动手做 OrderContent.UnitCost, OrderContent.ProQuantity, (OrderContent.ProQuantity * OrderContent.UnitCost) as ExtendedAmount FROM OrderContent INNER JOIN Products ON OrderContent.ProID = Products.ProID WHERE OrderID = @OrderID END OrdersDetail存储过程从订单信息表和订单详细信息表中获取商品的编号、商品名称、市场价格、销售单价、订单中的购买数量以及最后的消费总额。 至此,网络商城系统的基本功能已经实现。 (注:针对各个模块的程序代码请参考教材!)
做中检 检查学生是否能能够编写具有实际功能的网络商城的各个功能模块的程序代码块。
做中评 能对网络商城的各个模块代码编写有个清晰的认识和提升 能够熟悉用C#和数据库联合开发软件的流程和方法