zoukankan      html  css  js  c++  java
  • 重新过一遍ASP.NET 2.0(C#)(8) DataSourceControl(数据源控件)

    介绍
    在 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_参数名”则为初始值
      ·还有一些如编程方式给参数赋值,错误处理,得到返回值之类的请看源码


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

    单例模式的实现
    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();
        }

    }


    中间层代码
    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
    <%@ 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" />
                    
    <asp:BoundField DataField="ParentId" HeaderText="ParentId" SortExpression="ParentId"
                        NullDisplayText
    ="我的值是NULL" />
                    
    <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
                    
    <asp:BoundField DataField="PublishTime" HeaderText="PublishTime" SortExpression="PublishTime"
                        ReadOnly
    ="true" />
                    
    <asp:BoundField DataField="Price" HeaderText="Price" SortExpression="Price" DataFormatString="{0:c}" HtmlEncode="false" ApplyFormatInEditMode="True" />
                    
    <asp:CheckBoxField DataField="IsGood" HeaderText="IsGood" SortExpression="IsGood" />
                
    </Columns>
            
    </asp:GridView>
        
    </p>
        
    <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetTest"
            TypeName
    ="Test" InsertMethod="InsertTest" DeleteMethod="DeleteTest" UpdateMethod="UpdateTest"
            OnInserting
    ="ObjectDataSource1_Inserting" OnInserted="ObjectDataSource1_Inserted">
            
    <InsertParameters>
                
    <%--ConvertEmptyStringToNull属性默认为true--%>
                
    <asp:Parameter Name="parentId" Type="Int32" ConvertEmptyStringToNull="true" />
                
    <asp:Parameter Name="name" Type="String" />
                
    <asp:Parameter Name="publishTime" Type="DateTime" />
                
    <asp:Parameter Name="price" Type="Decimal" />
                
    <asp:Parameter Name="isGood" Type="Boolean" />
                
    <asp:Parameter Direction="Output" Name="minId" Type="Int32" />
            
    </InsertParameters>
            
    <DeleteParameters>
                
    <asp:Parameter Name="id" Type="Int32" />
            
    </DeleteParameters>
            
    <UpdateParameters>
                
    <asp:Parameter Name="id" Type="Int32" />
                
    <asp:Parameter Name="parentId" Type="Int32" />
                
    <asp:Parameter Name="name" Type="String" />
                
    <asp:Parameter Name="publishTime" Type="DateTime" />
                
    <asp:Parameter Name="price" Type="Decimal" />
                
    <asp:Parameter Name="isGood" Type="Boolean" />
            
    </UpdateParameters>
        
    </asp:ObjectDataSource>
        
    <asp:ObjectDataSource ID="ObjectDataSource2" runat="server" OldValuesParameterFormatString="original_{0}"
            SelectMethod
    ="GetTestById" TypeName="Test">
            
    <SelectParameters>
                
    <asp:ControlParameter ControlID="GridView1" Name="id" PropertyName="SelectedValue"
                    Type
    ="Int32" />
            
    </SelectParameters>
        
    </asp:ObjectDataSource>
    </asp:Content>

    DataSourceControl/Test.aspx.cs
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    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;

    public partial class DataSourceControl_Test : System.Web.UI.Page
    {
        
    protected void Page_Load(object sender, EventArgs e)
        
    {

        }


        
    protected void ObjectDataSource1_Inserting(object sender, ObjectDataSourceMethodEventArgs e)
        
    {
            
    // 编程方式给参数赋值
            if (e.InputParameters["publishTime"== null)
            
    {
                e.InputParameters[
    "publishTime"= DateTime.Now;
            }

        }


        
    protected void ObjectDataSource1_Inserted(object sender, ObjectDataSourceStatusEventArgs e)
        
    {
            
    // 错误处理
            if (e.Exception != null)
            
    {
                
    if (e.Exception.InnerException != null)
                
    {
                    Exception inner 
    = e.Exception.InnerException;

                    
    if (inner is ArgumentException)
                    
    {
                        
    string paramName = ((ArgumentException)inner).ParamName;
                        lblMsg.Text 
    = string.Concat("参数 ", paramName, " 有问题");
                    }

                }

            }

            
    else
            
    {
                
    int?[] ary = (int?[])e.ReturnValue;
                lblMsg.Text 
    = "新插入信息的ID是:" + ary[0].ToString();
                lblMsg.Text 
    += "<br />数据总数是:" + ary[1].ToString();

                lblMsg.Text 
    += "<br />最小ID是:" + e.OutputParameters["minId"].ToString();
            }

        }


        
    protected void DetailsView1_ItemInserted(object sender, DetailsViewInsertedEventArgs e)
        
    {
            
    if (e.Exception != null)
            
    {
                
    // 错误已处理
                e.ExceptionHandled = true;
                
    // DetailsView保持插入状态
                e.KeepInInsertMode = true;
            }

        }


        
    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        
    {
            
    // 价格格式转换为decimal格式
            if (e.NewValues["Price"!= null)
                e.NewValues[
    "Price"= decimal.Parse(e.NewValues["Price"].ToString(), System.Globalization.NumberStyles.Currency);
        }

    }



    OK
    [源码下载]
  • 相关阅读:
    re
    response.xpath
    response.css
    mongovue无法显示collection的问题
    window下安装scrapy
    openCV 图片的处理
    sql server 日期时间操作
    怎样在visual studio 2005 让客户端的recv函数不阻塞
    c# winform 程序用126邮箱发邮件
    MiniDump类笔记
  • 原文地址:https://www.cnblogs.com/hulu/p/797875.html
Copyright © 2011-2022 走看看