【问题标题】:Changing SqlDataSource.SelectCommand at runtime breaks pagination在运行时更改 SqlDataSource.SelectCommand 会中断分页
【发布时间】:2011-03-20 03:52:14
【问题描述】:

我有一个GridView 绑定到一个SqlDataSource,默认SelectCommand 定义如下:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" DataSourceMode="DataSet"
      ConnectionString="<%$ ConnectionStrings:MyConn %>" 
      ProviderName="MySql.Data.MySqlClient" 
      SelectCommand="select * from blah blah" />

在某些情况下,我必须在运行时动态更改此查询,因此我执行以下操作:

SqlDataSource1.SelectCommand = sql; // 'sql' is the new query
GridView1.PageIndex = 0;
GridView1.EditIndex = -1;
GridView1.SelectedIndex = -1;
GridView1.DataBind();
updatePanel.Update();

这实际上工作得很好,但是当我单击分页控件时,结果集默认返回到SqlDataSource1 中定义的SelectCommand

有什么办法吗?

谢谢, 标记

【问题讨论】:

    标签: asp.net gridview pagination sqldatasource selectcommand


    【解决方案1】:

    1) 尝试从页面预览中设置数据源,而不是动态设置。这是最清晰的解决方案 如果你不能,

    2) 尝试在 page_load 之前生成列表。我认为将代码放在 page_init 下可能会奏效。我现在记不太清了,但是page_load之前有一个方法。

    【讨论】:

      【解决方案2】:

      这里的问题是,当 Pager 链接发出的提交页面加载时,SqlDataSource 正在重新创建。没有什么可以告诉它动态加载您设置的内容。如果您要使用带参数的存储过程,那么 ASP 会将参数保存到 ViewState 并在页面加载时重新运行 SqlDataSource 中的选择。

      所以你要做的就是告诉 SqlDataSource 上次正确加载时它对 SQL 有什么。

      最简单的方法是在设置 SqlDataSource 的 SelectCommand 时将 SQL 存储在 ViewState 中,然后在 Page_Load 事件中再次检索它并重新设置。

      例如:假设您有一个用于某些条件的文本框和一个搜索按钮。当用户在 TextBox 中输入一些文本,然后单击“搜索”按钮时,您希望它建立一些 SQL(顺便说一下,这会使您面临 SQL 注入攻击的巨大风险。确保您擦洗您的条件很好。)然后设置 SqlDataSource 的 SelectCommand 属性。正是在这一点上,您希望节省 SQL。然后在 Page_Load 事件中,您需要检索它并将 SelectCommand 属性设置为该值。

      在您的按钮单击中,您可以存储 SQL:

      Dim sSQL as String
      
      sSQL = "SELECT somefields FROM sometable WHERE somefield = '" & Me.txtCriteria.Text & "'"
      SqlDataSource1.SelectCommand = sSQL
      ViewState("MySQL") = sSQL
      

      然后在 Page_Load 事件中,您可以检索 SQL 并设置 SelectCommand 属性:

      Dim sSQL as String
      
      If Me.IsPostBack() Then
          sSQL = ViewState("MySQL")
          SqlDataSource1.SelectCommand = sSQL
      End If
      

      【讨论】:

      • -1 这种方式容易发生SQL注入,不推荐。您应该使用参数,而不是字符串连接。
      • 迈克,您对 SQL 注入的看法是正确的,我在原始回复中确实注意到了这一点。我只是试图回答被问到的问题。我也同意使用带参数的存储过程是更好的方法。
      猜你喜欢
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      相关资源
      最近更新 更多