在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);
    }

轉載出處:http://blog.csdn.net/ILOVEMSDN/archive/2007/11/11/1879318.aspx

goodlucky 發表在 痞客邦 PIXNET 留言(0) 人氣()