• ASP.NET-DataSourceControl(数据源控件)使用汇总
  • 发布于 2个月前
  • 209 热度
    0 评论
  • 李凌
  • 1 粉丝 18 篇博客
  •   

介绍
在 ASP.NET 2.0 中有几个新的数据源控件,例如,SqlDataSource、ObjectDataSource、XmlDataSource、AccessDataSource 和 SiteMapDataSource。它们全都可以用来从它们各自类型的数据源中检索数据,并且可以绑定到各种数据绑定控件。数据源控件减少了为检索和绑定数据甚至对数据进行排序、分页或编辑而需要编写的自定义代码的数量。

其中 ObjectDataSource 控件可针对各种基础数据存储区(如 SQL 数据库或 XML)启用声明性数据绑定模型。因为页开发人员也常常将数据检索(也可能包含业务逻辑)封装在一个组件对象中,从而在呈现页和数据提供程序之间引入另一个层。ObjectDataSource 控件允许开发人员使用此传统的三层结构构造应用程序,同时仍然能够利用 ASP.NET 中的声明性数据绑定模型的易用性优点。


关键
1、在数据层创建 强类型的DataSet和TableAdapter,TableAdapter查询可以使用现有的存储过程。注:直接把表或存储过程拖进来会自动创建TableAdapter

2、中间层的类用[System.ComponentModel.DataObject]声明为数据组件,CRUD方法分别对应[DataObjectMethod(DataObjectMethodType.Insert)],[DataObjectMethod(DataObjectMethodType.Select)],[DataObjectMethod(DataObjectMethodType.Update)],[DataObjectMethod(DataObjectMethodType.Delete)]

3、web层使用ObjectDataSource展现数据,ObjectDataSource就相当于一个代理。ObjectDataSource只是查找具有匹配的参数名称的方法,它不会使用参数的 Type 或 Size,而只是对参数的名称进行匹配

4、其它
  ·<asp:Parameter />有ConvertEmptyStringToNull属性,默认是true。另外还有Direction属性
  ·注意<asp:BoundField />的这几个属性NullDisplayText,HtmlEncode,ApplyFormatInEditMode,InsertVisible,DataFormatString,ReadOnly
  ·DataKeyNames有多个值的话用“,”分隔,用<asp:ControlParameter />绑定的话给其加一个“PropertyName”属性,值类似如下“SelectedDataKey.Values[0]”
  ·关于绑定:简单属性<%# custID %>;集合<asp:ListBox id="List1" datasource='<%# myArray %>' runat="server">;表达式<%# ( customer.FirstName + " " + customer.LastName ) %>;方法<%# GetBalance(custID) %>
  ·<%# Eval("field1") %> 和 <%# Bind("field1") %>,Eval是单向绑定,Bind是双向邦定
  ·<asp:ObjectDataSource />有一个OldValuesParameterFormatString属性一般不用,不过如果要处理乐观并发之类的就会用到。当该属性的值为“original_{0}”的时候“original_参数名”则为初始值
  ·还有一些如编程方式给参数赋值,错误处理,得到返回值之类的请看源码


示例
相关存储过程和数据层略,见源码

单例模式的实现

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
App_Code/Singleton.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
 
/// <summary>
/// Singleton 的摘要说明
/// </summary>
public class Singleton<T> where T : new()
{
    public static T Instance
    {
        get return SingletonCreator.instance; }
    }
 
    class SingletonCreator
    {
        internal static readonly T instance = new T();
    }
}


中间层代码

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
App_Code/Test.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
 
using TestDatabaseTableAdapters;
using System.ComponentModel;
 
/// <summary>
/// Test 的摘要说明
/// </summary>
[DataObject]
public class Test
{
    [DataObjectMethod(DataObjectMethodType.Select, true)]
    public TestDatabase.TestDataTable GetTest()
    {
        return Singleton<TestTableAdapter>.Instance.GetTest();
    }
 
    [DataObjectMethod(DataObjectMethodType.Select, false)]
    public TestDatabase.TestDataTable GetTestById(int id)
    {
        return Singleton<TestTableAdapter>.Instance.GetTestById(id);
    }
 
    [DataObjectMethod(DataObjectMethodType.Insert, true)]
    public int?[] InsertTest(int? parentId, string name, DateTime? publishTime, decimal? price, bool? isGood, out int? minId)
    {
        // 仅为说明如何做错误处理
        if (String.IsNullOrEmpty(name))
            throw new ArgumentException("参数不能是空""name");
 
        int? id = null;
        int? count = null;
        minId = null;
 
        Singleton<TestTableAdapter>.Instance.InsertTest(parentId, name, publishTime, price, isGood, ref id, ref count, ref minId);
        return new int?[] { id, count };
    }
 
    [DataObjectMethod(DataObjectMethodType.Delete, true)]
    public int? DeleteTest(int id)
    {
        int? rowAffected;
 
        rowAffected = Singleton<TestTableAdapter>.Instance.DeleteTest(id);
        return rowAffected;
    }
 
    [DataObjectMethod(DataObjectMethodType.Update, true)]
    public int? UpdateTest(int? id, int? parentId, string name, DateTime? publishTime, decimal? price, bool? isGood)
    {
        int? rowAffected;
 
        rowAffected = Singleton<TestTableAdapter>.Instance.UpdateTest(id, parentId, name, publishTime, price, isGood);
        return rowAffected;
    }
}


DataSourceControl/Test.aspx


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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Test.aspx.cs"
    Inherits="DataSourceControl_Test" Title="数据源控件测试" %>
 
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
    <p>
        <asp:Label ID="lblMsg" runat="server" ForeColor="red" />
    </p>
    <table cellpadding="6">
        <tr>
            <td valign="top">
                <asp:DetailsView ID="DetailsView1" runat="server" AllowPaging="True" AutoGenerateRows="False"
                    DataKeyNames="Id" DataSourceID="ObjectDataSource1" Height="50px" Width="125px" OnItemInserted="DetailsView1_ItemInserted">
                    <Fields>
                        <asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False" ReadOnly="True"
                            SortExpression="Id" />
                        <asp:BoundField DataField="ParentId" HeaderText="ParentId" SortExpression="ParentId" />
                        <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
                        <asp:BoundField DataField="PublishTime" HeaderText="PublishTime" SortExpression="PublishTime"
                            InsertVisible="False" />
                        <asp:BoundField DataField="Price" HeaderText="Price" SortExpression="Price" DataFormatString="{0:c}" HtmlEncode="False" />
                        <asp:CheckBoxField DataField="IsGood" HeaderText="IsGood" SortExpression="IsGood" />
                        <asp:CommandField ShowInsertButton="True" />
                    </Fields>
                </asp:DetailsView>
            </td>
            <td valign="top">
                <asp:DetailsView ID="DetailsView2" runat="server" Height="50px" Width="125px" AutoGenerateRows="False" DataKeyNames="Id" DataSourceID="ObjectDataSource2">
                    <Fields>
                        <asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False" ReadOnly="True"
                            SortExpression="Id" />
                        <asp:BoundField DataField="ParentId" HeaderText="ParentId" SortExpression="ParentId" />
                        <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
                        <asp:BoundField DataField="PublishTime" HeaderText="PublishTime" SortExpression="PublishTime" />
                        <asp:BoundField DataField="Price" HeaderText="Price" SortExpression="Price" DataFormatString="{0:c}" HtmlEncode="false" />
                        <asp:CheckBoxField DataField="IsGood" HeaderText="IsGood" SortExpression="IsGood" />
                    </Fields>
                </asp:DetailsView>
            </td>
        </tr>
    </table>
    <p>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="Id"
            DataSourceID="ObjectDataSource1" AllowPaging="True" AllowSorting="True" OnRowUpdating="GridView1_RowUpdating">
            <Columns>
                <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" ShowSelectButton="True" />
                <asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False" ReadOnly="True"
                    SortExpression="Id" />
           &