一步一步学习ObjectDataSource--(2)
在上篇文章介绍了ObjectDataSource的基本使用,本节进行进一步说明该控件的使用
上篇文章的地址为:http://mqingqing123.cnblogs.com/archive/2006/04/06/368452.html
------------------------------------
在上篇的文章里获取员工信息时,曾经说了这样一段话:
在上面GetRecords()的定义时,可以看到该方法返回的类型是DataView,由于ObjectDataSource将来需要作为绑定控件的数据来源,所以它的返回类型必须如下的返回类型之一:
Ienumerable、DataTable、DataView、DataSet或者Object。
然而,微软并不推荐这么做,ASP.NET2.0新的泛型语法在这里得到体现,为了更好的进行业务逻辑封装,我们需要更进一步的封装业务逻辑,以便返回强类型。 我们可以定义一个Employee.cs文件,该文件来封装员工的信息,并放置在App_Code下,以便后面EmployeeBLL.css共享该类, Employee.cs定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | using System; public class Employee { protected int _EmployeeId; protected string _LastName; protected int _Firstname; protected int _Title; protected string _Region; protected decimal _PostalCode; public int EmployeeId { get { return _EmployeeId; } set { _EmployeeId= value; } } public string LastName { get { return _LastName; } set { _LastName= value; } } public int Firstname { get { return _Firstname; } set { _Firstname= value; } } public int Title { get { return _Title; } set { _Title= value; } } public string Region { get { return _Region; } set { _Region= value; } } public decimal PostalCode { get { return _PostalCode; } set { _PostalCode= value; } } public Employee() { _Employee= -1; } public Employee( int employeeID, string lastName, string firstName, string region, decimal postalCode) { this ._EmployeeID= employeeID; this .Lastname=lastName; this .FirstName=firstName; this .Region=region; this .postalCode=PostalCode; } |
这段代码并没有什么特殊的,用Employee类方装了其字段,这样使用get/set访问器定义其为属性,以后就可以通过
Employee1.LastName,Employee1.FirstName来进行访问。
接下来就可以建立自己的业务逻辑代码,EmployeeBLL.cs文件,并放置在App_COde文件夹下,为了简化,这里仅仅给出了选择和编辑的源代码,至于删除、插入你很容易写出,:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Data.Common; using System.Data.SqlClient; using System.Web; public class EmployeeBLL { public List<Employee> LoadAll() { //建立一个泛类型对象Employees List<Employee> Employees = new List<Employee>(); //从web.config里读取数据库配置连接,这里的读取不是ASP.NET1.1的模式,而使用的是ConfigurationManager类 SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[ "Northwind" ].ConnectionString); SqlCommand command = new SqlCommand( "SELECT * FROM Employees" , conn); conn.Open(); SqlDataReader dr = command.ExecuteReader(); while (dr.Read()) { //读取数据库里的数据 Employee prod = new Employee(); prod.EmployeeID = ( int )dr[ "EmployeeID" ]; prod.EmployeeName = ( string )dr[ "FistName" ]; prod.SupplierID = ( int )dr[ "LastID" ]; ... ... //将数据加入Employees队列 Employees.Add(prod); } dr.Close(); conn.Close(); return Employees; } |
在这段代码里,你可以看到代码返回的是Employee强类型,可能你还没有感觉业务逻辑封装带来的便利,看看下面是辑用户的代码,如下:
我们在上一节说过,通过直接SQL获取8个字段,所有你更新时,更新的方法也就需要8个参数。同样的,当使用泛型时,因为LoadAll返回的是Employee类型,所有你更新时
也就需要Employee参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 | public static void Edit(Employee prod) { SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[ "Northwind" ].ConnectionString); SqlCommand command = new SqlCommand( "UPDATE Employees SET LastName=@LastName, FirstName=@FirstName,... ..." , conn); command.Parameters.Add( new SqlParameter( "@LastName" , prod.Last)); command.Parameters.Add( new SqlParameter( "@FistName" ,prod.FirstName)); command.Parameters.Add( new SqlParameter( "@CategoryID" , prod.CategoryID)); ... ... conn.Open(); command.ExecuteNonQuery(); conn.Close(); } |
此时你可以看到,编辑用户资料Edit需要的参数是Employee类型参数,这样对于上层业务而言,主要传递给它Employee参数即可,其它不需要你处理。 当然如果你愿意(这也是传统的模式),你可能还可以公开具体更新的参数,如下:
1 2 3 | public static void Edit( int employeeID, string firstName, string lastName, string title, string Region, decimal postal) { } |
这种方法在上层引用时,甚至能够猜测出你的数据库设计结构,例如很容易知道包含EmployeeID列,FirstName等,而使用
Edit(Employee prod)则没有办法猜出,这也是封装的好处,
最后 这样,引用逻辑代码使用ObjectDataSource控件为:
1 2 3 4 5 6 7 | <asp:ObjectDataSource ID= "BllObjectDataSource" runat= "server" SelectMethod= "LoadAll" TypeName= "EmployeeBLL" DataObjectTypeName= "Employee" DeleteMethod= "Delete" UpdateMethod= "Edit" > </asp:ObjectDataSource> |
请注意:你需要设置DataObjectTypeName指向你的强类型类。至于DeleteMethod和UpdateMethod这里没有给出代码,自己实现吧
-----------------------------------
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C#线程池核心技术:从原理到高效调优的实用指南
· .NET 的全新低延时高吞吐自适应 GC - Satori GC
· 使用 C++ 20 协程降低异步网络编程复杂度
· 使用 libdivide 加速整数除法运算
· 为什么互联网这么卷?
· 会用 AI 的工程师,效率已经拉开差距了 - “ 我们曾经引以为傲的编码能力,正在被改写。”
· 【译】Visual Studio 2022 v17.14 现已正式发布!
· 一个基于 C# 编写的事件驱动、具备专业水准的算法交易平台(量化交易引擎)
· VS Code + Cline + 魔搭MCP Server 实现抓取网页内容。
· 好端端的线程池,怎么就卡死了?