在ASPX SqlDataSource SelectCommand中使用字符串变量,这可能吗?

时间:2017-04-07 16:46:02

标签: c# sql asp.net selectcommand

我知道这在代码隐藏中是可能的,但是在那里更改selectcommand并绑定它会导致gridview问题的刷新和排序,所以这不是我正在寻找的答案。

我已经为我的SQL参数添加了参数化语句,但是我需要更改查询的其他部分,我认为它不会作为参数化语句。

示例:

<asp:SqlDataSource ID="SQLSolutionSource" runat="server" 
 SelectCommand="SELECT id, my_cat1, my_cat2, my_cat3, my_cat4, my_cat5, my_cat6 FROM [my_db].[dbo].[my_table]"
  ConnectionString="<%$ ConnectionStrings:ConnectionString %>" /> 

我将有大约10个IF ELSE语句使用命令的“SELECT id,my_cat1,my_cat2,my_cat3,my_cat4,my_cat5,my_cat6”部分。

如果是代码隐藏,我可以用上面的字符串创建一个变量,并将selectcommand更改为“”+ my_string +“FROM [my_db]。[dbo]。[my_table]”;

有没有办法在ASPX页面上执行此操作?我已经尝试创建公共字符串并使用SelectCommand =“&lt;%= my_string%&gt; FROM [my_db]。[dbo]。[my_table]”但它似乎根本不起作用。

我理解人们可能会对安全性和SQL注入感到疑惑,但是这个变量将被硬编码,并且不允许用户更改。我只是想简化我的命令并清理我的代码,所以如果我需要更改所选项目,我只需要在一个变量中进行,而不是在10个不同的地方。

1 个答案:

答案 0 :(得分:0)

最终,我能够使用EXECUTE sp_executesql构建一个动态SQL查询作为我的selectcommand工作得很好。

编辑:在下面添加了示例。

示例代码(未经测试,可能需要调整,因为我的生产代码完全不同)

  <asp:SqlDataSource ID="SQLSolutionSource" runat="server" 
        SelectCommand="
        declare @perm_source varchar(30)
        set @perm_source = @perm_type

        declare @select_query Nvarchar(400)    
        SET @select_query = 'SELECT id, my_cat1, my_cat2, my_cat3, my_cat4, my_cat5, my_cat6 FROM ' + @perm_source
        EXECUTE sp_executesql @select_query

        "
        ConnectionString="<%$ ConnectionStrings:ConnectionString %>" /> 

现在有些人可能认为FROM'+ @perm_source容易受到注入攻击,但在我的情况下它不是,因为变量(@perm_type)是参数化的,并且仅基于代码隐藏的静态值。