0

我知道这在代码隐藏中是可能的,但是在那里更改 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”部分。

如果它是代码隐藏,我可以使用上面的字符串创建一个变量并将选择命令更改为 "" + my_string + " FROM [my_db].[dbo].[my_table]";

有没有办法在 ASPX 页面上做到这一点?我尝试创建公共字符串并使用 SelectCommand="<%= my_string %> FROM [my_db].[dbo].[my_table]" 但它似乎根本不起作用。

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

4

1 回答 1

0

最终,我能够使用 EXECUTE sp_executesql 构建一个动态 SQL 查询作为运行良好的选择命令。

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

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

  <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) 是参数化的并且仅基于来自代码隐藏的静态值。

于 2017-05-10T18:00:49.210 回答