在运行时更改SqlDataSource.SelectCommand会破坏分页

Mar*_*man 4 asp.net pagination gridview sqldatasource selectcommand

我有一个GridView绑定到SqlDataSource一个默认的SelectCommand定义是这样的:

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

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

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

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

有什么方法吗?

谢谢,马克

dsc*_*arr 8

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

因此,您需要做的是告诉SqlDataSource它在上次正确加载时对SQL有什么用处.

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

例如:假设您有一些标准的TextBox和一个搜索按钮.当用户在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
Run Code Online (Sandbox Code Playgroud)

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

Dim sSQL as String

If Me.IsPostBack() Then
    sSQL = ViewState("MySQL")
    SqlDataSource1.SelectCommand = sSQL
End If
Run Code Online (Sandbox Code Playgroud)

  • 迈克,你对SQL注入是正确的,我在原始响应中注意到了.我只是想回答被问到的问题.我也同意使用带参数的存储过程是更好的方法. (5认同)
  • -1这种方法很容易出现SQL注入,不推荐使用.您应该使用参数,而不是字符串连接. (2认同)