2010-07-23 7 views
4

У меня есть GridView привязанных к SqlDataSource с умолчанию SelectCommand определяются как например:Изменения SqlDataSource.SelectCommand во время выполнения перерывов PAGINATION

<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(); 

Это прекрасно работает на самом деле, но когда я нажимаю управление нумерацией страниц, набор результатов, по умолчанию обратно в SelectCommand, определенном в SqlDataSource1.

В любом случае?

Спасибо, Марк

ответ

8

Проблема заключается в том, что SqlDataSource воссоздается, когда страница загружается с помощью отправки, выданной ссылками Pager. Нельзя сказать, чтобы он загружал то, что вы установили динамически. Если вы должны использовать хранимую процедуру с параметрами, тогда ASP сохранит параметры в ViewState и повторно запустит выбор в SqlDataSource при загрузке страницы.

Итак, что вам нужно сделать, это указать SqlDataSource, что у него было для SQL при его правильной загрузке.

Простейший способ сделать это - сохранить SQL в ViewState при установке SelectCommand из SqlDataSource, а затем восстановить его снова в событии Page_Load и установить его обратно.

Например: предположим, что у вас есть TextBox для некоторых критериев и кнопка поиска. Когда пользователь вводит какой-либо текст в TextBox, а затем нажимает кнопку «Поиск», вы хотите, чтобы он создал некоторый SQL (это, кстати, дает вам огромную угрозу атакам SQL Injection. критерии хорошо.), а затем установите свойство SelectCommand SqlDataSource. Это означает, что вы хотите сэкономить 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 
+2

-1 Этот подход подвержен SQL-инъекции и не рекомендуется. Вы должны использовать параметры, а не конкатенацию строк. –

+5

Майк, ты прав насчет инъекции SQL, и я заметил это в исходном ответе. Я просто пытался ответить на заданный вопрос. Я также согласен с тем, что использование хранимой процедуры с параметрами является лучшим способом. – dscarr

0

1) Попробуйте установить источник данных из предварительного просмотра страницы, а не динамически. Это наиболее четкое решение. Если вы не можете,

2) Попробуйте создать список до page_load. Я думаю, что размещение кода под page_init может сделать трюк. На данный момент я точно не помню, но есть метод до page_load.

Смежные вопросы