Asp.net2.0中ObjectDataSource在三层(N层)架构中的应用

不知道大家看没看过《ASP.NET2.0开发指南》这本书。不管这本书怎么样(看到网上骂声不断),对于我这种菜鸟来说还是有些帮助的。既然花了钱买了书,肯定得学点东西才行。下面我就把个人学习ObjectDataSource的一些心得跟大家分享一下。
这里说是使用ObjectDataSource,其实更多的,是要了解三层(N层)架构方面的知识。首先我们可以根据下面的图例,建立三个项目:
1、WEB站点 用户界面层
2、AuthorDB 数据访问层
3、LogicLibrary 业务逻辑层
Image000044.jpg
接下来,我们分别实现这三层。
数据访问层的实现:
这里用了一个组件AuthorDB.cs来完成对数据库的操作,具体代码如下

 1 None.gif using  System;
 2 None.gif using  System.Collections.Generic;
 3 None.gif using  System.Text;
 4 None.gif using  System.Data;
 5 None.gif using  System.Data.OleDb;
 6 None.gif using  System.Xml;
 7 None.gif
 8 None.gif namespace  AuthorDB
 9 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
10InBlock.gif    public class AuthorDB
11ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
12InBlock.gif        //数据库连接字符串
13InBlock.gif        static string str = System.Configuration.ConfigurationSettings.AppSettings["ConnStrings"].ToString().Trim();
14InBlock.gif        //构造函数
15InBlock.gif        public AuthorDB()
16ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{ }
17InBlock.gif        //获取地址
18InBlock.gif        public static DataSet GetStates()
19ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
20InBlock.gif            string strCmd = "select distinct state from authors";
21InBlock.gif            return DataAdapterFill(strCmd,"state");
22ExpandedSubBlockEnd.gif        }

23InBlock.gif        //通过地址获取信息
24InBlock.gif        public static DataSet GetAuthorsByState(string state)
25ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
26InBlock.gif            string strCmd = "select * from authors where state='"+state.ToString().Trim()+"'";
27InBlock.gif            return DataAdapterFill(strCmd,"authors");
28InBlock.gif
29ExpandedSubBlockEnd.gif        }

30InBlock.gif        //修改信息
31InBlock.gif        public static int UpdateAuthor(string au_id,string au_fname,string au_lname,string state)
32ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
33InBlock.gif            string strCmd = "update authors set firstname='"+au_fname+"',lastname='"+au_lname+"',state='"+state+"' where id='"+au_id+"'";
34InBlock.gif            return DataCommand(strCmd);
35ExpandedSubBlockEnd.gif        }

36ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
37InBlock.gif        /// DataAdapterFill
38InBlock.gif        /// </summary>
39InBlock.gif        /// <param name="strCmd">SQL语句</param>
40InBlock.gif        /// <param name="tablename">表名</param>
41ExpandedSubBlockEnd.gif        /// <returns>数据集</returns>

42InBlock.gif        private static DataSet DataAdapterFill(string strCmd, string tablename)
43ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
44InBlock.gif            OleDbConnection conn = new OleDbConnection(str);
45InBlock.gif            OleDbDataAdapter da = new OleDbDataAdapter(strCmd, conn);
46InBlock.gif            DataSet ds = new DataSet();
47InBlock.gif            conn.Open();
48InBlock.gif            da.Fill(ds, tablename);
49InBlock.gif            conn.Close();
50InBlock.gif            return ds;
51ExpandedSubBlockEnd.gif        }

52ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
53InBlock.gif        /// DataCommand方法
54InBlock.gif        /// </summary>
55InBlock.gif        /// <param name="strCmd">SQL语句</param>
56ExpandedSubBlockEnd.gif        /// <returns>影响行数</returns>

57InBlock.gif        private static int DataCommand(string strCmd)
58ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
59InBlock.gif            OleDbConnection conn = new OleDbConnection(str);
60InBlock.gif            OleDbCommand cmd = new OleDbCommand(strCmd, conn);
61InBlock.gif            int rowsAffected = 0;
62InBlock.gif            conn.Open();
63InBlock.gif            try
64ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
65InBlock.gif                rowsAffected = cmd.ExecuteNonQuery();
66ExpandedSubBlockEnd.gif            }

67InBlock.gif            catch
68ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{ }
69InBlock.gif            finally
70ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
71InBlock.gif                conn.Close();
72ExpandedSubBlockEnd.gif            }

73InBlock.gif            return rowsAffected;
74ExpandedSubBlockEnd.gif        }

75ExpandedSubBlockEnd.gif    }

76ExpandedBlockEnd.gif}

77 None.gif


业务逻辑层的实现:[注:逻辑层要引用AuthorDB.dll]
业务逻辑层主要由业务实体Author.cs和逻辑组件AuthorsComponent.cs组成[为什么要使用业务实体/怎么使用业务实体这里暂时不做介绍,请不择手段自己搜索]
业务实体实现代码

 1 None.gif using  System;
 2 None.gif using  System.Collections.Generic;
 3 None.gif using  System.Text;
 4 None.gif
 5 None.gif namespace  LogicLibrary
 6 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 7InBlock.gif    public class Author
 8ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 9InBlock.gif        private string _id;
10InBlock.gif        private string _firstname;
11InBlock.gif        private string _lastname;
12InBlock.gif        private string _state;
13InBlock.gif        
14InBlock.gif        public Author()
15ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{ }
16InBlock.gif        public Author(string id,string firstname,string lastname,string state)
17ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
18InBlock.gif            this.ID = id;
19InBlock.gif            this.FirstName = firstname;
20InBlock.gif            this.LastName = lastname;
21InBlock.gif            this.State = state;
22ExpandedSubBlockEnd.gif        }

23InBlock.gif        public string ID
24ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
25InBlock.gif            get
26ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
27InBlock.gif                return _id;
28ExpandedSubBlockEnd.gif            }

29InBlock.gif            set
30ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
31InBlock.gif                _id = value;
32ExpandedSubBlockEnd.gif            }

33ExpandedSubBlockEnd.gif        }

34InBlock.gif        public string FirstName
35ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
36InBlock.gif            get
37ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
38InBlock.gif                return _firstname;
39ExpandedSubBlockEnd.gif            }

40InBlock.gif            set
41ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
42InBlock.gif                _firstname = value;
43ExpandedSubBlockEnd.gif            }

44ExpandedSubBlockEnd.gif        }

45InBlock.gif        public string LastName
46ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
47InBlock.gif            get
48ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
49InBlock.gif                return _lastname;
50ExpandedSubBlockEnd.gif            }

51InBlock.gif            set
52ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
53InBlock.gif                _lastname = value;
54ExpandedSubBlockEnd.gif            }

55ExpandedSubBlockEnd.gif        }

56InBlock.gif        public string State
57ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
58InBlock.gif            get
59ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
60InBlock.gif                return _state;
61ExpandedSubBlockEnd.gif            }

62InBlock.gif            set
63ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
64InBlock.gif                _state = value;
65ExpandedSubBlockEnd.gif            }

66ExpandedSubBlockEnd.gif        }

67InBlock.gif
68ExpandedSubBlockEnd.gif    }

69ExpandedBlockEnd.gif}

70 None.gif


逻辑组件实现代码

 1 None.gif using  System;
 2 None.gif using  System.Collections.Generic;
 3 None.gif using  System.Text;
 4 None.gif using  System.Data;
 5 None.gif
 6 None.gif namespace  LogicLibrary
 7 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 8InBlock.gif    public class AuthorsComponent
 9ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
10InBlock.gif        //构造函数
11InBlock.gif        public AuthorsComponent()
12ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{ }
13InBlock.gif        //通过地址获取信息
14InBlock.gif        public List<Author> GetAuthorsByState(string state, string sortExpression)
15ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
16InBlock.gif            List<Author> authors = new List<Author>();
17InBlock.gif            DataSet ds = AuthorDB.AuthorDB.GetAuthorsByState(state);
18InBlock.gif            foreach (DataRow row in ds.Tables["authors"].Rows)
19ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
20InBlock.gif                authors.Add(new Author((string)row["id"],(string)row["firstname"],(string)row["lastname"],(string)row["state"]));
21ExpandedSubBlockEnd.gif            }

22InBlock.gif            authors.Sort(new AuthorComparer(sortExpression));
23InBlock.gif            return authors;
24ExpandedSubBlockEnd.gif        }

25InBlock.gif        //获取地址
26InBlock.gif        public List<string> GetStates()
27ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
28InBlock.gif            List<string> states = new List<string>();
29InBlock.gif            DataSet ds = AuthorDB.AuthorDB.GetStates();
30InBlock.gif            foreach (DataRow row in ds.Tables["state"].Rows)
31InBlock.gif                states.Add((string)row["state"]);
32InBlock.gif            return states;
33ExpandedSubBlockEnd.gif        }
        
34InBlock.gif        //修改信息
35InBlock.gif        public int UpdateAuthor(Author a)
36ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
37InBlock.gif            return AuthorDB.AuthorDB.UpdateAuthor(a.ID,a.LastName,a.FirstName,a.State);
38ExpandedSubBlockEnd.gif        }

39InBlock.gif        //修改信息
40InBlock.gif        public int UpdateAuthor(string ID,string FirstName,string LastName,string State)
41ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
42InBlock.gif            return AuthorDB.AuthorDB.UpdateAuthor(ID,FirstName,LastName,State);
43ExpandedSubBlockEnd.gif        }

44ExpandedSubBlockEnd.gif    }

45InBlock.gif    //自定义排序 实现IComparer接口
46InBlock.gif    public class AuthorComparer : IComparer<Author>
47ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
48InBlock.gif        private string _sortColumn;
49InBlock.gif        private bool _reverse;
50InBlock.gif        //构造函数
51InBlock.gif        public AuthorComparer(string sortExpression)
52ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
53InBlock.gif            _reverse = sortExpression.ToLowerInvariant().EndsWith(" desc");
54InBlock.gif            if (_reverse)
55ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
56InBlock.gif                _sortColumn = sortExpression.Substring(0, sortExpression.Length - 5);
57ExpandedSubBlockEnd.gif            }

58InBlock.gif            else
59ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
60InBlock.gif                _sortColumn = sortExpression;
61ExpandedSubBlockEnd.gif            }

62ExpandedSubBlockEnd.gif        }

63InBlock.gif        //实现接口的Compare方法 比较两个Author对象实例
64InBlock.gif        public int Compare(Author a,Author b)
65ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
66InBlock.gif            int retVal = 0;
67InBlock.gif            switch (_sortColumn)
68ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
69InBlock.gif                case "ID":
70InBlock.gif                    retVal = String.Compare(a.ID, b.ID, StringComparison.InvariantCultureIgnoreCase);
71InBlock.gif                    break;
72InBlock.gif                case "FirstName":
73InBlock.gif                    retVal = String.Compare(a.FirstName, b.FirstName, StringComparison.InvariantCultureIgnoreCase);
74InBlock.gif                    break;
75InBlock.gif                case "LastName":
76InBlock.gif                    retVal = String.Compare(a.LastName, b.LastName, StringComparison.InvariantCultureIgnoreCase);
77InBlock.gif                    break;
78InBlock.gif                case "State":
79InBlock.gif                    retVal = String.Compare(a.State, b.State, StringComparison.InvariantCultureIgnoreCase);
80InBlock.gif                    break;
81ExpandedSubBlockEnd.gif            }

82InBlock.gif            return (retVal*(_reverse?-1:1));
83ExpandedSubBlockEnd.gif        }

84ExpandedSubBlockEnd.gif    }
 
85ExpandedBlockEnd.gif}

86 None.gif


接下来我们要实现的是用户界面层:[注:界面层要引用LogicLibrary项目生成的dll文件]
用户界面层实现比较简单,这要归功于asp.net2.0中为我们提供的两个用户控件GridView和ObjectDataSource.[具体使用方法自己搜索]
我们先在页面上拖放1个DropDownList,2个ObjectDataSource,1个GridView控件。
Image000022.jpg

具体设置请参见如下页面代码[注:加粗部分要特别注意]

 1 ExpandedBlockStart.gif ContractedBlock.gif <% dot.gif @ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"  %>
 2 None.gif
 3 None.gif <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
 4 None.gif < html  xmlns ="http://www.w3.org/1999/xhtml" >
 5 None.gif < head  runat ="server" >
 6 None.gif     < title > Untitled Page </ title >
 7 None.gif </ head >
 8 None.gif < body >
 9 None.gif     < form  id ="form1"  runat ="server" >
10 None.gif         < div >
11 None.gif            State:
12 None.gif             < asp:DropDownList  ID ="DropDownList1"  runat ="server"  DataSourceID ="obj1" AutoPostBack="True"
13 None.gif                Width ="255px" >
14 None.gif             </ asp:DropDownList >
15 None.gif             < asp:ObjectDataSource  ID="obj1"  runat ="server"  TypeName ="LogicLibrary.AuthorsComponent"
16None.gif                SelectMethod="GetStates" ></ asp:ObjectDataSource >
17 None.gif             < asp:GridView  ID ="gridview1"  runat ="server"  DataSourceID ="objectdatasource2"  AllowPaging ="True"
18 None.gif                AllowSorting ="True"  AutoGenerateColumns ="False"  EnableTheming ="True"  BackColor ="White"
19 None.gif                BorderColor ="#CCCCCC"  BorderStyle ="None"  BorderWidth ="1px"  CellPadding ="3"  Width ="308px" >
20 None.gif                 < Columns >
21 None.gif                     < asp:CommandField  ShowEditButton ="True"  CancelText ="Cancle"   />
22 None.gif                     < asp:BoundField  DataField ="id"  HeaderText ="id"  SortExpression ="ID"   />
23 None.gif                     < asp:BoundField  DataField ="firstname"  HeaderText ="firstname"  SortExpression ="FristName"   />
24 None.gif                     < asp:BoundField  DataField ="lastname"  HeaderText ="lastname"  SortExpression ="LastName"   />
25 None.gif                     < asp:BoundField  DataField ="state"  HeaderText ="state"  SortExpression ="State"   />
26 None.gif                 </ Columns >
27 None.gif                 < FooterStyle  BackColor ="White"  ForeColor ="#000066"   />
28 None.gif                 < RowStyle  ForeColor ="#000066"   />
29 None.gif                 < SelectedRowStyle  BackColor ="#669999"  Font-Bold ="True"  ForeColor ="White"   />
30 None.gif                 < PagerStyle  BackColor ="White"  ForeColor ="#000066"  HorizontalAlign ="Left"   />
31 None.gif                 < HeaderStyle  BackColor ="#006699"  Font-Bold ="True"  ForeColor ="White"   />
32 None.gif             </ asp:GridView >
33 None.gif             < asp:ObjectDataSource  ID="objectdatasource2"  runat ="server"  TypeName ="LogicLibrary.AuthorsComponent"
34None.gif                DataObjectTypeName="LogicLibrary.Author" SelectMethod="GetAuthorsByState" UpdateMethod="UpdateAuthor"
35None.gif                SortParameterName="sortExpression" >
36 None.gif                 < SelectParameters >
37 None.gif                     < asp:ControlParameter  ControlID="DropDownList1" Name="state" PropertyName="SelectedValue"   />
38 None.gif                 </ SelectParameters >
39 None.gif             </ asp:ObjectDataSource >
40 None.gif         </ div >
41 None.gif     </ form >
42 None.gif </ body >
43 None.gif </ html >
44 None.gif

OK,一切都搞定了。以上代码已经在winxp+vs.net2005上测试通过。它可以实现数据的显示、筛选、排序功能。我们来看看运行结果:
Image000011.jpg
Image000033.jpg
附:Access数据库的XML文件

 1 None.gif <? xml version="1.0" encoding="UTF-8" ?>
 2 None.gif < root  xmlns:xsd ="http://www.w3.org/2001/XMLSchema"  xmlns:od ="urn:schemas-microsoft-com:officedata" >
 3 None.gif   < xsd:schema >
 4 None.gif     < xsd:element  name ="dataroot" >
 5 None.gif       < xsd:complexType >
 6 None.gif         < xsd:sequence >
 7 None.gif           < xsd:element  ref ="authors"  minOccurs ="0"  maxOccurs ="unbounded" />
 8 None.gif         </ xsd:sequence >
 9 None.gif         < xsd:attribute  name ="generated"  type ="xsd:dateTime" />
10 None.gif       </ xsd:complexType >
11 None.gif     </ xsd:element >
12 None.gif     < xsd:element  name ="authors" >
13 None.gif       < xsd:annotation >
14 None.gif         < xsd:appinfo >
15 None.gif           < od:index  index-name ="id"  index-key ="id "  primary ="no"  unique ="no"  clustered ="no" />
16 None.gif         </ xsd:appinfo >
17 None.gif       </ xsd:annotation >
18 None.gif       < xsd:complexType >
19 None.gif         < xsd:sequence >
20 None.gif           < xsd:element  name ="id"  minOccurs ="0"  od:jetType ="text"  od:sqlSType ="nvarchar" >
21 None.gif             < xsd:simpleType >
22 None.gif               < xsd:restriction  base ="xsd:string" >
23 None.gif                 < xsd:maxLength  value ="50" />
24 None.gif               </ xsd:restriction >
25 None.gif             </ xsd:simpleType >
26 None.gif           </ xsd:element >
27 None.gif           < xsd:element  name ="firstname"  minOccurs ="0"  od:jetType ="text"  od:sqlSType ="nvarchar" >
28 None.gif             < xsd:simpleType >
29 None.gif               < xsd:restriction  base ="xsd:string" >
30 None.gif                 < xsd:maxLength  value ="50" />
31 None.gif               </ xsd:restriction >
32 None.gif             </ xsd:simpleType >
33 None.gif           </ xsd:element >
34 None.gif           < xsd:element  name ="lastname"  minOccurs ="0"  od:jetType ="text"  od:sqlSType ="nvarchar" >
35 None.gif             < xsd:simpleType >
36 None.gif               < xsd:restriction  base ="xsd:string" >
37 None.gif                 < xsd:maxLength  value ="50" />
38 None.gif               </ xsd:restriction >
39 None.gif             </ xsd:simpleType >
40 None.gif           </ xsd:element >
41 None.gif           < xsd:element  name ="state"  minOccurs ="0"  od:jetType ="text"  od:sqlSType ="nvarchar" >
42 None.gif             < xsd:simpleType >
43 None.gif               < xsd:restriction  base ="xsd:string" >
44 None.gif                 < xsd:maxLength  value ="50" />
45 None.gif               </ xsd:restriction >
46 None.gif             </ xsd:simpleType >
47 None.gif           </ xsd:element >
48 None.gif         </ xsd:sequence >
49 None.gif       </ xsd:complexType >
50 None.gif     </ xsd:element >
51 None.gif   </ xsd:schema >
52 None.gif   < dataroot  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"  generated ="2007-04-16T15:32:00" >
53 None.gif     < authors >
54 None.gif       < id > 1 </ id >
55 None.gif       < firstname > Wang </ firstname >
56 None.gif       < lastname > First </ lastname >
57 None.gif       < state > usa </ state >
58 None.gif     </ authors >
59 None.gif     < authors >
60 None.gif       < id > 2 </ id >
61 None.gif       < firstname > Second </ firstname >
62 None.gif       < lastname > Li </ lastname >
63 None.gif       < state > Japan </ state >
64 None.gif     </ authors >
65 None.gif     < authors >
66 None.gif       < id > 3 </ id >
67 None.gif       < firstname > Third </ firstname >
68 None.gif       < lastname > Zhao </ lastname >
69 None.gif       < state > USA </ state >
70 None.gif     </ authors >
71 None.gif     < authors >
72 None.gif       < id > 5 </ id >
73 None.gif       < firstname > Four </ firstname >
74 None.gif       < lastname > Guo </ lastname >
75 None.gif       < state > China </ state >
76 None.gif     </ authors >
77 None.gif     < authors >
78 None.gif       < id > 4 </ id >
79 None.gif       < firstname > Five </ firstname >
80 None.gif       < lastname > Qi </ lastname >
81 None.gif       < state > China </ state >
82 None.gif     </ authors >
83 None.gif   </ dataroot >
84 None.gif </ root >
85 None.gif

转载于:https://www.cnblogs.com/syringa-flz/archive/2007/04/17/715465.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值