现在的位置: 首页 > 综合 > 正文

asp.net2.0中的DataSource概述

2013年10月11日 ⁄ 综合 ⁄ 共 12241字 ⁄ 字号 评论关闭
在asp.net2.0中提供了新一代的数据访问工具--DataSource。它为简单的数据库开发提供了便捷的方式。
一、DataSource & ADO.Net
    ADO.Net是微软先进的数据库访问技术,那它和DataSource控件相比有哪些区别呢?
    1、ADO.Net是微软新一代的数据库访问技术,并将继续担任数据库访问的重要任务。它对开发人员要求较高、灵活度较高,对于初学人员难以很好的驾驭。
    2、DataSource控件是asp.net2.0中新推的数据库访问工具,它不属于ADO.Net。它为不熟悉ADO.Net和SQL的人员提供了一 个便捷简单的数据访问方式,其优点是,对常用的增、删、改、查的数据库操作支持较好,能够自动优化数据库访问逻辑,并且能与一些数据绑定控件相互配合简化 程序开发。其缺点是数据处理的灵活度较差。
    DataSource不能完全替代ADO.Net,它将来的应用场境一般为:
    1)快速开发,对于业务逻辑简单的小项目,以拖动的方式来构建。
    2)与ADO.Net配合使用,主要担任业务业务功能层数据的调用,并配合数据绑定控件显示数据。
二、DataSource分类
    SqlDataSource:访问各种数据库,支持高速缓存,支持筛选、排序、分页等功能。
    ObjectDataSource:访问与使用各种业务对象提取数据,并为web层提供绑定数据。
    XMLDataSource:能够使用业务对象和XML文件,并为web层提供中间数据。
    SiteMapDataSource:搭配导航控件读取.sitmap文件中的数据。
三、架构图

四、DataSource参数类型  

*SQLDataSource*

一、配置连接字符串:
<connectionStrings>
<add name="conn1" connectionString="server=./sqlexpress;database=mydb;uid=sa;pwd=123" />
</connectionStrings>

二、读取连接字符串:
    编程方式:
        string str = System.Configuration.ConfigurationManager.ConnectionStrings["conn1"].ToString();
    声明方式:
        <asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:conn1 %>" ID="sds1" runat="server">
       
三、SQLDataSource的几个重要的属性:
    ConnectionString:(string)与数据库连接字符串
    SelectCommand:(string)执行查询的SQL语句               
    InsertCommand:(string)执行插入的SQL语句
    UpdateCommand:(string)执行更新的SQL语句
    DeleteCommand:(string)执行删除的SQL语句       
    ID:控件的ID,(据绑定控件一起使用)

   
四、SQLDataSource的几个重要方法:
    Select():调用SelectCommand进行查询
    Insert():调用InsertCommand进行插入
    Update():调用UpdateCommand进行更新
    Delete():调用DeleteCommand进行删除

五、SQLDataSource的几个重要子元素:
    InsertParameters:为InsertCommand的SQL语句提供参数
    UpdateParameters:为UpdateParameters的SQL语句提供参数
    DeleteParameters:为DeleteParameters的SQL语句提供参数
    SelectParameters:为SelectParameters的SQL语句提供参数  

   
    上面四个Parameters对象的参数:
        Name:对应SQL语句中相应的参数的名称(不用加@)
        ControlID:如果参数的值来自于页面控件,那此属性就对应控件的ID值
        Size:参数的长度
        Type:参数的类型
        Direction:参数的方向(Input,Output,ReturnValue)
        DefaultValue:参数没赋值的话的默认值

   
六、SQLDataSource以声明方式实现增删改查
        <asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:conn1 %>"
        SelectCommand="SELECT * FROM fruit "
        InsertCommand="insert into fruit(ids,name,price,source,stack) values(@ids,@name,@price,@source,@stack)"
        UpdateCommand = "update fruit set name=@name,price = @price,source = @source,stack = @stack where ids = @ids"
        DeleteCommand = "delete from fruit where ids = @ids"
        ID="SqlDataSource1" runat="server" ProviderName="System.Data.SqlClient">
            <DeleteParameters>
                <asp:ControlParameter ControlID="txtIds" Name="ids" />
            </DeleteParameters>
            <UpdateParameters>
                <asp:ControlParameter ControlID="txtIds" Name="ids" />
                <asp:ControlParameter ControlID="txtName" Name="name" />
                <asp:ControlParameter ControlID="txtPrice" Name="price" />
                <asp:ControlParameter ControlID="txtSource" Name="source" />
                <asp:ControlParameter ControlID="txtStack" Name="stack" />
            </UpdateParameters>
            <InsertParameters>
                <asp:ControlParameter ControlID="txtIds" Name="ids" />
                <asp:ControlParameter ControlID="txtName" Name="name" />
                <asp:ControlParameter ControlID="txtPrice" Name="price" />
                <asp:ControlParameter ControlID="txtSource" Name="source" />
                <asp:ControlParameter ControlID="txtStack" Name="stack" />
            </InsertParameters>
        </asp:SqlDataSource>
      
七、SQLDataSource以编程方式实现增删改查
        SqlDataSource sd = new SqlDataSource();
        sd.ID = "sqlsource";
        sd.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["conn1"].ToString();
        sd.DataSourceMode = SqlDataSourceMode.DataSet;
        sd.SelectCommand = "select * from fruit";
        sd.InsertCommand = "insert into fruit(ids,name,price,source,stack) values(@ids,@name,@price,@source,@stack)";
        sd.UpdateCommand = "update fruit set name = @name,price = @price,source=@source,stack=@stack where ids = @ids";
        sd.DeleteCommand = "delete from fruit where ids = @ids";
        sd.InsertParameters.Add("ids",TypeCode.String,txtIds.Text);
        sd.InsertParameters.Add("name", TypeCode.String, txtName.Text);
        sd.InsertParameters.Add("price", TypeCode.Decimal, txtPrice.Text);
        sd.InsertParameters.Add("source", TypeCode.String, txtSource.Text);
        sd.InsertParameters.Add("stack", TypeCode.String, txtStack.Text);
        sd.UpdateParameters.Add("ids", TypeCode.String, txtIds.Text);
        sd.UpdateParameters.Add("name", TypeCode.String, txtName.Text);
        sd.UpdateParameters.Add("price", TypeCode.Decimal, txtPrice.Text);
        sd.UpdateParameters.Add("source", TypeCode.String, txtSource.Text);
        sd.UpdateParameters.Add("stack", TypeCode.String, txtStack.Text);
        sd.DeleteParameters.Add("ids",TypeCode.String,txtIds.Text);
        Controls.Add(sd);
        this.GridView1.DataSourceID = sd.ID;

*ObjectDataSource*

SQLDataSource虽然使用起来比较简单,但它与数据库之间的直接访问,导致我们在使用的过程中缺乏了灵活性。
在开发过程中我们为了实现程序的合理结构和良好的代码重用功能,一般会把程序用三层来进行架构。而SQLDataSource这种直接连接数据库的功能,对三层架构来说很难实现。
如果不用SQLDataSource控件,那GridView的好多功能就不能完全正常发挥其威力。为了解决这个问题,微软为我们提供了ObjectDataSource这个控件。

ObjectDataSource控件并不直接与数据库之间进行连接,可以通过对业务对象的调用,实现对数据库的操作。

一、ObjectDataSource控件的几个重要属性

    SelectMethod:ObjectDataSource控件执行查询时调用的方法名。
   DeleteMethod:ObjectDataSource控件执行删除时调用的方法名。
    UpdateMethod:ObjectDataSource控件执行更新时调用的方法名。
    InsertMethod:ObjectDataSource控件执行插入时调用的方法名。

二、ObjectDataSource控件的几个重要方法
    Select():调用SelectMethod进行查询
    Insert():调用InsertMethod进行插入
    Update():调用UpdateMethod进行更新
   Delete():调用DeleteMethod进行删除

三、ObjectDataSource控件的几个重要的子元素
    InsertParameters:为InsertMethod的方法提供参数
    UpdateParameters:为UpdateMethod的方法提供参数
    DeleteParameters:为DeleteMethod的方法提供参数
    SelectParameters:为SelectMethod的方法提供参数
   
四、举例
    1.配置连接字符串
    2.编写业务模块(此处我用数据库的insert/update/delete/select来替代,在实际应用中,业务模块远比此复杂)
        在此业务功能模块用的是SQLDataSource对象读取数据的,当然也可以用ADO.NET来读取数据
        public class FruitDA
        {
            private SqlDataSource sd;
            public FruitDA()
            {
                sd = new SqlDataSource();
                sd.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["conn1"].ToString();;
            }
            public DataView select()
            {
                sd.SelectCommand = "select * from fruit";
                sd.DataSourceMode = SqlDataSourceMode.DataSet;
                DataView ds = (DataView)sd.Select(DataSourceSelectArguments.Empty);
                return ds;
            }
            public void update(string ids,string name,decimal price,string source,string stack)
            {
                sd.UpdateCommand = "update fruit set name = @name,price = @price,source = @source,stack = @stack where ids = @ids";
                sd.UpdateParameters.Add("ids", TypeCode.String, ids);
                sd.UpdateParameters.Add("name",TypeCode.String,name);
                sd.UpdateParameters.Add("price", TypeCode.Decimal, price.ToString());
                sd.UpdateParameters.Add("source",TypeCode.String,source);
                sd.UpdateParameters.Add("stack",TypeCode.String,stack);
                sd.Update();
            }
            public void insert(string ids, string name, decimal price, string source, string stack)
            {
                sd.InsertCommand = "insert into fruit (ids,name,price,source,stack) values(@ids,@name,@price,@source,@stack)";
                sd.InsertParameters.Add("ids", TypeCode.String, ids);
                sd.InsertParameters.Add("name", TypeCode.String, name);
                sd.InsertParameters.Add("price", TypeCode.Decimal, price.ToString());
                sd.InsertParameters.Add("source", TypeCode.String, source);
                sd.InsertParameters.Add("stack", TypeCode.String, stack);
                sd.Insert();
            }
            public void delete(string ids)
            {
                sd.DeleteCommand = "delete from fruit where ids = @ids";
                sd.DeleteParameters.Add("ids",TypeCode.String,ids);
                sd.Delete();
            }
        }
    3.配置ObjectDataSource和GridView,实现update/select/delete功能
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ids" DataSourceID="s">
            <Columns>
                <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
                <asp:BoundField DataField="ids" />
                <asp:BoundField DataField="name" />
                <asp:BoundField DataField="price" />
                <asp:BoundField DataField="source" />
                <asp:BoundField DataField="stack" />
            </Columns>
        </asp:GridView>
        <asp:ObjectDataSource ID="s" runat="server" SelectMethod="select" TypeName="FruitDA" DeleteMethod="delete" UpdateMethod="update" InsertMethod="insert" >
            <DeleteParameters>
                <asp:Parameter Name="ids" Type="String" />
            </DeleteParameters>
            <UpdateParameters>
                <asp:Parameter Name="ids" Type="String" />
                <asp:Parameter Name="name" Type="String" />
                <asp:Parameter Name="price" Type="Decimal" />
                <asp:Parameter Name="source" Type="String" />
                <asp:Parameter Name="stack" Type="String" />
            </UpdateParameters>
            <InsertParameters>
                <asp:ControlParameter Name="ids" ControlID = "txtIds" Type="String" />
                <asp:ControlParameter Name="name" ControlID = "txtName" Type="String" />
                <asp:ControlParameter Name="price" ControlID = "txtPrice" Type="Decimal" />
                <asp:ControlParameter Name="source" ControlID = "txtSource" Type="String" />
                <asp:ControlParameter Name="stack" ControlID = "txtStack" Type="String" />
            </InsertParameters>

        </asp:ObjectDataSource>
        <asp:TextBox ID="txtIds" runat="server"></asp:TextBox>
        <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
        <asp:TextBox ID="txtPrice" runat="server"></asp:TextBox>
        <asp:TextBox ID="txtSource" runat="server"></asp:TextBox>
        <asp:TextBox ID="txtStack" runat="server"></asp:TextBox><br />
        <asp:Button ID="Button1" runat="server" Text="Insert" OnClick="Button1_Click" />
    4.实现插入功能的代码
         protected void Button1_Click(object sender, EventArgs e)
        {
            s.Insert();
        }           

    ControlParameter:以窗体控件的属性值作为参数
    FormParameter:以窗体控件的id作为参数
    CookieParameter:以Cookie值作为参数
    SessionParameter:以Session值作为参数
    QuaryStringParameter:以查询字符串作为参数
    ProfileParameter:以个性化设置的内容作为参数
    在ado.net1.1中好象中只有一种参数类型,为什么要在这里出现这么多的参数类型?
    1、检查参数的来源类型,防止篡改Cookie或QuaryString的值进地攻击
    2、对参数的长度进行检查
    3、对注入式攻击的代码进行安全处理
   
    参数举例:
    1 .ControParameter
    protected void Button1_Click(object sender, EventArgs e)
    {
        SqlDataSource1.SelectCommand = "select * from fruit where ids = @ids";
          //ddl是下拉列表
        ControlParameter param = new ControlParameter("ids", "ddl", "SelectedItem.Value");
       
        SqlDataSource1.SelectParameters.Clear();
        SqlDataSource1.SelectParameters.Add(param);
    }

    2.SessionParameter
    protected void Button2_Click(object sender, EventArgs e)
    {
        Session["data"] = txtIds.Text;
        SqlDataSource1.SelectCommand = "select * from fruit where ids = @ids";
        SessionParameter param = new SessionParameter("ids", "data");
        SqlDataSource1.SelectParameters.Clear();
        SqlDataSource1.SelectParameters.Add(param);
       
    }
   
    3.CookieParameter
    protected void Button3_Click(object sender, EventArgs e)
    {
        Response.Cookies.Add(new HttpCookie("data",txtIds.Text));
        SqlDataSource1.SelectCommand = "select * from fruit where ids = @ids";
        CookieParameter param = new CookieParameter("ids", "data");
        SqlDataSource1.SelectParameters.Clear();
        SqlDataSource1.SelectParameters.Add(param);
    }
    4.QuryStringParameter
    protected void Button4_Click(object sender, EventArgs e)
    {
        Response.Redirect("default5.aspx?id="+txtIds.Text);
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (Request.QueryString["id"] != null)
            {
                Response.Cookies.Add(new HttpCookie("data", txtIds.Text));
                SqlDataSource1.SelectCommand = "select * from fruit where ids = @ids";
                QueryStringParameter param = new QueryStringParameter("ids", "id");
                SqlDataSource1.SelectParameters.Clear();
                SqlDataSource1.SelectParameters.Add(param);
            }
        }
    }
   
    5.FormParameter
    protected void Button5_Click(object sender, EventArgs e)
    {
        SqlDataSource1.SelectCommand = "select * from fruit where ids = @ids";
        FormParameter param = new FormParameter("ids", "ddl");
        SqlDataSource1.SelectParameters.Clear();
        SqlDataSource1.SelectParameters.Add(param);
    }

抱歉!评论已关闭.