zoukankan      html  css  js  c++  java
  • 一步一步学习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定义如下:

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

    我们在上一节说过,通过直接SQL获取8个字段,所有你更新时,更新的方法也就需要8个参数。同样的,当使用泛型时,因为LoadAll返回的是Employee类型,所有你更新时

    也就需要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 ID="BllObjectDataSource" runat="server" 
                SelectMethod="LoadAll" 
                TypeName="EmployeeBLL" 
                DataObjectTypeName="Employee" 
                DeleteMethod="Delete" UpdateMethod="Edit" 
                >
            </asp:ObjectDataSource>
    

      

    请注意:你需要设置DataObjectTypeName指向你的强类型类。至于DeleteMethod和UpdateMethod这里没有给出代码,自己实现吧

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

     

     

  • 相关阅读:
    迭代模型
    螺旋模型
    瀑布模型
    V模型
    codeforces411div.2
    专题1:记忆化搜索/DAG问题/基础动态规划
    Python
    字符串的相关操作方法
    Python基本数据类型
    编码
  • 原文地址:https://www.cnblogs.com/mqingqing123/p/369020.html
Copyright © 2011-2022 走看看