程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 如何為 SqlDataSource 動態綁定變量參數

如何為 SqlDataSource 動態綁定變量參數

編輯:.NET實例教程

對於 xxxDataSource 來說,支持綁定參數,包括 ControlParameter、CookIEParameter、SessionParameter、ProfileParameter 和 QueryStringParameter。假如參數值直接來自於應用程序變量或者通過某個方法返回呢?
查閱了關於參數基類 Parameter 類 似乎不支持此功能,有一個選擇就是擴展自己的 Parameter,但是工作量比大,本身使用 xxxDataSource 就是為了快速開發。

這裡采用比較“原始”方法:直接使用Web服務器控件都支持的綁定語法 <%# expression %>

先看下面這個 SqlDataSource ,其中的 SelectCommand 屬性,是通過動態綁定實現的,categoryId 是一個私有類字段。


<ASP:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="Data Source=.;Initial Catalog=Northwind;Integrated Security=True"
            ProviderName="System.Data.SqlClIEnt" SelectCommand='<%# "SELECT * FROM [Products] WHERE [CategoryID] = " + categoryId %>'>  <%--動態綁定 SelectCommand 命令--%>       
        </ASP:SqlDataSource>
可以通過控件事件中改變類字段 categoryId 的值,然後調用 SqlDataSource1.DataBind() 計算此值,得出 SelectCommand

甚至可以綁定一個方法,處理一個比較復雜sql語句,並返回

 <ASP:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="Data Source=.;Initial Catalog=Northwind;Integrated Security=True"
            ProviderName="System.Data.SqlClIEnt" SelectCommand='<%# GetSelectCommandText() %>' >  <%--動態綁定 SelectCommand 命令--%>       
        </ASP:SqlDataSource>    

 private string GetSelectCommandText()
    {
        string sql = "SELECT * FROM [Products]";
        if (DropDownList1.SelectedValue != "") {
            sql += " WHERE [CategoryID] = " + int.Parse(DropDownList1.SelectedValue);
        }
        return sql;
  }
測試實例通過一個 DropDownList 改變 categoryId 的值

protected void DropDownList1_SelectedIndExchanged(object sender, EventArgs e)
    {
        categoryId = int.Parse(DropDownList1.SelectedValue);
        SqlDataSource1.DataBind(); // 先執行綁定數據源控件,計算 SelectCommand 
        GridVIEw1.DataBind();

        SqlDataSource3.DataBind(); // 先執行綁定數據源控件,計算 SelectCommand 
        GridVIEw2.DataBind();
    }

其實,都是 ASP.Net 1.x 中數據綁定的應用而已,唯一需要注意的是,調用數據控件(如GridVIEw)的 DataBind 方法之前一定要先調用數據源控件(如SqlDataSource)的 DataBind() 方法。

完整代碼:


<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xHtml1-transitional.dtd">

<script runat="server">
    
    protected int categoryId = 1;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack) {            
            SqlDataSource1.DataBind();            
            SqlDataSource3.DataBind();
        }
    }

    protected void DropDownList1_SelectedIndExchanged(object sender, EventArgs e)
    {
        categoryId = int.Parse(DropDownList1.SelectedValue);
        SqlDataSource1.DataBind(); // 先執行綁定數據源控件,計算 SelectCommand 
        GridVIEw1.DataBind();

        SqlDataSource3.DataBind(); // 先執行綁定數據源控件,計算 SelectCommand 
        GridVIEw2.DataBind();
    }

    private string GetSelectCommandText()
   {
        string sql = "SELECT * FROM [Products]";
        if (DropDownList1.SelectedValue != "") {
            sql += " WHERE [CategoryID] = " + int.Parse(DropDownList1.SelectedValue);
        }
        return sql;
    }
 
</script>

<html XMLns="http://www.w3.org/1999/xHtml" >
<head runat="server">
    <title>DataBindForSelectCommand2</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <ASP:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlDataSource2" AutoPostBack="true"
            DataTextField="CategoryName" DataValueFIEld="CategoryID" OnSelectedIndexChanged="DropDownList1_SelectedIndExchanged">
        </ASP:DropDownList>
        <ASP:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="Data Source=.;Initial Catalog=Northwind;Integrated Security=True"
            ProviderName="System.Data.SqlClient" SelectCommand="SELECT [CategoryID], [CategoryName] FROM [CategorIEs]">
        </ASP:SqlDataSource>
        
        <ASP:GridView ID="GridVIEw1" runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID"
        DataSourceID="SqlDataSource1" >
            <Columns>
                <ASP:BoundField DataFIEld="ProductID" HeaderText="ProductID" InsertVisible="False"
                    ReadOnly="True" SortExpression="ProductID" />
                <ASP:BoundField DataFIEld="ProductName" HeaderText="ProductName" SortExpression="ProductName" />                
            </Columns>
        </ASP:GridVIEw>
        <ASP:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="Data Source=.;Initial Catalog=Northwind;Integrated Security=True"
            ProviderName="System.Data.SqlClIEnt" SelectCommand='<%# "SELECT * FROM [Products] WHERE [CategoryID] = " + categoryId %>'>  <%--動態綁定 SelectCommand 命令--%>       
        </ASP:SqlDataSource>    
        
        <ASP:GridView ID="GridVIEw2" runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID"
            DataSourceID="SqlDataSource3" >
            <Columns>
                <ASP:BoundField DataFIEld="ProductID" HeaderText="ProductID" InsertVisible="False"
                    ReadOnly="True" SortExpression="ProductID" />
                <ASP:BoundField DataFIEld="ProductName" HeaderText="ProductName" SortExpression="ProductName" />                
            </Columns>
        </ASP:GridVIEw>
        <ASP:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="Data Source=.;Initial Catalog=Northwind;Integrated Security=True"
      ProviderName="System.Data.SqlClIEnt" SelectCommand='<%# GetSelectCommandText() %>' >  <%--動態綁定 SelectCommand 命令--%>       
        </ASP:SqlDataSource>    
    </div>
    </form>
</body>
</Html>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved