ASP.NET DEMO 13: 如何为 SqlDataSource 动态绑定变量参数

对于 xxxDataSource 来说,支持绑定参数,包括 ControlParameter、CookieParameter、SessionParameter、ProfileParameter 和 QueryStringParameter。假如参数值直接来自于应用程序变量或者通过某个方法返回呢?
查阅了关于参数基类 Parameter 类似乎不支持此功能,有一个选择就是扩展自己的 Parameter,但是工作量比大,本身使用 xxxDataSource 就是为了快速开发。

这里采用比较“原始”方法:直接使用Web服务器控件都支持的绑定语法 <%# expression%>

先看下面这个 SqlDataSource ,其中的 SelectCommand 属性,是通过动态绑定实现的,categoryId 是一个私有类字段。

< asp:SqlDataSource ID ="SqlDataSource1" runat ="server" ConnectionString ="DataSource=.;InitialCatalog=Northwind;IntegratedSecurity=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 ="DataSource=.;InitialCatalog=Northwind;IntegratedSecurity=True"
ProviderName
="System.Data.SqlClient" SelectCommand ='<%# GetSelectCommandText()% > '> <% --动态绑定SelectCommand命令-- %>
</ asp:SqlDataSource >

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

returnsql;
}

测试实例通过一个 DropDownList 改变 categoryId 的值
protected void DropDownList1_SelectedIndexChanged( object sender,EventArgse)
{
categoryId
=int.Parse(DropDownList1.SelectedValue);
SqlDataSource1.DataBind();
//先执行绑定数据源控件,计算SelectCommand
GridView1.DataBind();

SqlDataSource3.DataBind();
//先执行绑定数据源控件,计算SelectCommand
GridView2.DataBind();
}


其实,都是 ASP.NET 1.x 中数据绑定的应用而已,唯一需要注意的是,调用数据控件(如GridView)的 DataBind 方法之前一定要先调用数据源控件(如SqlDataSource)的 DataBind() 方法。

完整代码:

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><%@PageLanguage="C#"%>

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<scriptrunat="server">

protected
intcategoryId=1;

protected
voidPage_Load(objectsender,EventArgse)
{
if(!Page.IsPostBack){
SqlDataSource1.DataBind();
SqlDataSource3.DataBind();
}

}


protected
voidDropDownList1_SelectedIndexChanged(objectsender,EventArgse)
{
categoryId
=int.Parse(DropDownList1.SelectedValue);
SqlDataSource1.DataBind();
//先执行绑定数据源控件,计算SelectCommand
GridView1.DataBind();

SqlDataSource3.DataBind();
//先执行绑定数据源控件,计算SelectCommand
GridView2.DataBind();
}


privatestringGetSelectCommandText()
{
stringsql
="SELECT*FROM[Products]";
if(DropDownList1.SelectedValue!=""){
sql
+="WHERE[CategoryID]="+int.Parse(DropDownList1.SelectedValue);
}

returnsql;
}


</script>

<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>DataBindForSelectCommand2</title>
</head>
<body>
<formid="form1"runat="server">
<div>
<asp:DropDownListID="DropDownList1"runat="server"DataSourceID="SqlDataSource2"AutoPostBack="true"
DataTextField
="CategoryName"DataValueField="CategoryID"OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
</asp:DropDownList>
<asp:SqlDataSourceID="SqlDataSource2"runat="server"ConnectionString="DataSource=.;InitialCatalog=Northwind;IntegratedSecurity=True"
ProviderName
="System.Data.SqlClient"SelectCommand="SELECT[CategoryID],[CategoryName]FROM[Categories]">
</asp:SqlDataSource>

<asp:GridViewID="GridView1"runat="server"AutoGenerateColumns="False"DataKeyNames="ProductID"
DataSourceID
="SqlDataSource1">
<Columns>
<asp:BoundFieldDataField="ProductID"HeaderText="ProductID"InsertVisible="False"
ReadOnly
="True"SortExpression="ProductID"/>
<asp:BoundFieldDataField="ProductName"HeaderText="ProductName"SortExpression="ProductName"/>
</Columns>
</asp:GridView>
<asp:SqlDataSourceID="SqlDataSource1"runat="server"ConnectionString="DataSource=.;InitialCatalog=Northwind;IntegratedSecurity=True"
ProviderName
="System.Data.SqlClient"SelectCommand='<%#"SELECT*FROM[Products]WHERE[CategoryID]="+categoryId%>'><%--动态绑定SelectCommand命令--%>
</asp:SqlDataSource>

<asp:GridViewID="
GridView2"runat="server"AutoGenerateColumns="False"DataKeyNames="ProductID"
DataSourceID
="SqlDataSource3">
<Columns>
<asp:BoundFieldDataField="ProductID"HeaderText="ProductID"InsertVisible="False"
ReadOnly
="True"SortExpression="ProductID"/>
<asp:BoundFieldDataField="ProductName"HeaderText="ProductName"SortExpression="ProductName"/>
</Columns>
</asp:GridView>
<asp:SqlDataSourceID="SqlDataSource3"runat="server"ConnectionString="DataSource=.;InitialCatalog=Northwind;IntegratedSecurity=True"
ProviderName
="System.Data.SqlClient"SelectCommand='<%#GetSelectCommandText()%>'><%--动态绑定SelectCommand命令--%>
</asp:SqlDataSource>
</div>
</form>
</body>
</html>

你可能感兴趣的:(sql,sql,.net,server,asp.net,asp)