一步一步学习ObjectDataSource 二

在上篇文章天天介绍了ObjectDataSource的基本使用,本节进行进一步说明该控件的使用
上篇文章的地址为:http://blog.csdn.net/MadeInJack/archive/2008/04/05/2252660.aspx

------------------------------------

 在上篇的文章里获取员工信息时,曾经说了这样一段话:
  在上面GetRecords()的定义时,可以看到该方法返回的类型是DataView,由于ObjectDataSource将来需要作为绑定控件的数据来源,所以它的返回类型必须如下的返回类型之一:
Ienumerable、DataTable、DataView、DataSet或者Object。

   然而,微软并不推荐这么做,ASP.NET2.0新的泛型语法在这里得到体现,(使用该类型可以得到比一般处理更快的结果,我并没有进行测试,听说而已 呵呵)。
  为了更好的进行业务逻辑封装,我们需要更进一步的封装业务逻辑,以便返回强类型。(事实上天天感觉,ASP.NET1.1更注重.NET的实现,而ASP.NET2.0更注重框架结构的设计,这可能是天天对ASP.NET1.1和ASP.NET2.0区别的最大感受)

  我们可以定义一个Employee.cs文件,该文件来封装员工的信息,并放置在App_Code下,以便后面EmployeeBLL.css共享该类, Employee.cs定义如下:
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文件夹下,为了简化,这里仅仅给出了选择和编辑的源代码,至于删除、插入你很容易写出,:

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强类型,可能你还没有感觉业务逻辑封装带来的便利,看看下面是辑用户的代码,如下:

  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参数即可,其它不需要你处理。  当然如果你愿意(这也是传统的模式),你可能还可以公开具体更新的参数,如下:
public static void Edit(int employeeID,string firstName,string lastName,string title,string Region,decimal postal)
 {
   }

  这种方法在上层引用时,甚至能够猜测出你的数据库设计结构,例如很容易知道包含EmployeeID列,FirstName等,而使用
Edit(Employee prod)则没有办法猜出,这也是封装的好处,
最后 这样,引用逻辑代码使用ObjectDataSource控件为:
  <asp:ObjectDataSource runat="server"
            SelectMethod="LoadAll"
            TypeName="EmployeeBLL"
            DataObjectTypeName="Employee"
            DeleteMethod="Delete" UpdateMethod="Edit"
            >
        </asp:ObjectDataSource>
 
  请注意:你需要设置DataObjectTypeName指向你的强类型类。至于DeleteMethod和UpdateMethod这里没有给出代码,自己实现吧

-----------------------------------
在上面的EmployeeBll里可能有些人已经看到,在方法的前面加了static,加不加static的区别很大(可别小看它),
下一节,将更一步介绍该控件的使用,包括该控件设计的事件,当然还有绍数据绑定的原理-- 一个比较难的处理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值