基于DDL更改视图的动态SelectCommand

时间:2012-12-17 22:48:55

标签: asp.net visual-studio

这是我有一个下拉列表......

<asp:DropDownList
    ID="selectTimeFrame"
    runat="server"
    AutoPostBack="true"
    DataTextField="Increment"
    DataValueField="Increment"
    DataSourceID="SqlTimeFrame" 
</asp:DropDownList>

其数据源:

  <asp:SqlDataSource 
    ID="SqlTimeFrame"
    runat="server"
    ConnectionString="<% connectionstring %>"
    SelectCommand="Select [IncrementID], [Increment] FROM [TimeFrame] ORDER BY [IncrementID]" >
</asp:SqlDataSource>

然后我有一个gridview,数据源看起来像:

 <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<% connectinstring %>"
    ProviderName="<% connectionstring %>"
    SelectCommand="SELECT * FROM @TimeFrame">

    <SelectParameters>
        <asp:ControlParameter ControlID="selectTimeFrame"
            Name="TimeFrame"
            PropertyName="SelectedValue"
            Type="String" />
    </SelectParameters>

显然,我遇到问题的地方是“FROM @TimeFrame”没有按照我的意愿行事。我有不同的视图,其名称对应于不同的时间范围,我希望能够根据用户通过下拉菜单选择的选项更改gridview以填充该信息。任何见解都会非常感激......谢谢!! :d

1 个答案:

答案 0 :(得分:0)

你可以使用dynamic SQL来实现你正在寻找的东西,尽管你需要非常彻底地测试它以防止SQL注入攻击,因为我们永远不会相信从用户那里收到的输入。

我创建了一个简单的存储过程,用于检查数据库中是否存在该表,如果存在,则构造并执行动态SQL语句:

存储过程:

CREATE PROCEDURE dbo.GetData
@TableName NVARCHAR(200)
AS
BEGIN
IF OBJECT_ID(@TableName , N'U') IS NOT NULL
    BEGIN 
        EXEC('SELECT * FROM ' + @TableName);
    END
END

<强> ASPX:

<asp:DropDownList ID="selectTimeFrame" runat="server" AutoPostBack="true" DataTextField="Increment"
    DataValueField="Increment" DataSourceID="SqlTimeFrame" />
<asp:SqlDataSource ID="SqlTimeFrame" runat="server" ConnectionString="<%$ ConnectionStrings:connectionstring %>"
    SelectCommand="Select [IncrementID], [Increment] FROM [TimeFrame] ORDER BY [IncrementID]">
</asp:SqlDataSource>
<asp:SqlDataSource ID="dynamicDS" runat="server" ConnectionString="<%$ ConnectionStrings:connectionstring %>"
    SelectCommand="GetData" SelectCommandType="StoredProcedure">
    <SelectParameters>
        <asp:ControlParameter ControlID="selectTimeFrame" Name="TableName" PropertyName="SelectedValue"
            Type="String" />
    </SelectParameters>
</asp:SqlDataSource>
<asp:GridView ID="gvData" DataSourceID="dynamicDS" runat="server">
</asp:GridView>