SqlDataSource ControlParameter не работает
У меня есть выпадающий список (selProject), заполненный таблицей SQL. Значение - это поле идентификатора, имя - это поле имени.
У меня есть элемент управления gridview, питаемый sqldatasource.
То, что я хочу сделать, это условное предложение where на основе выпадающего списка selProject. Я потратил 3 часа на поиски и попытки выяснить это. Я боюсь, что я собираюсь сломать и убить помощника.
Когда я выбираю конкретное значение в раскрывающемся списке, selectedValue элемента управления "40". Я подтвердил это с помощью отладки. Это правильно и ожидаемо.
У меня есть controlParameter, который выглядит так:
<asp:ControlParameter ControlID="selProject" PropertyName="SelectedValue" Name="ProjectIDPass" Type="Int32" />
SelectCommand включает в себя: (Batches.ProjectID = @ProjectIDPass)
как часть предложения Where.
Я не получаю ни строк, ни ошибок, ни проблем. Я подозреваю, что проблема в SelectedValue раскрывающегося списка является строкой, а Batches.ProjectID является целым числом.
Когда я жестко кодирую 40 в предложении where вместо @ProjectIDPass, это прекрасно работает. Когда я возвращаюсь к ControlParameter, это бомбы. Я перепробовал все способы конвертации.
Есть ли способ увидеть SqlDataSouce SelectCommand, который был выполнен с фактическими значениями вместо параметров.
2 ответа
Я подозреваю, что проблема в SelectedValue раскрывающегося списка является строкой, а Batches.ProjectID является целым числом.
Сомнительный - Type
Свойство обрабатывает преобразование, и ваша СУБД также сработает (хотя, вероятно, она преобразует столбец int в строку, порча ваши индексы).
Есть ли способ увидеть SqlDataSouce SelectCommand, который был выполнен с фактическими значениями вместо параметров.
Профилировщик RDBMS, такой как Sql Profiler, был бы лучшим способом. Но вы также можете подключить SqlDataSource.Selecting
а также SqlDataSource.Selected
события и изучить e.Command
а также e.Arguments
,
Поэтому я решил свою проблему, и это было полное отсутствие понимания того, как обрабатываются GridView.
Я хотел загрузить данные, основанные на значениях из 2 Drop Downs, не делая пост обратно. Таким образом, пользователь может переходить со страницы на страницу, и ему не нужно сохранять настройки раскрывающихся списков. Это невозможно до тех пор, пока страница не будет загружена, поскольку раскрывающиеся списки не устанавливаются до тех пор, пока загрузка страницы почти не завершится. Gridview заполняются на странице Init. Я мог бы использовать куки, которые я устанавливал, чтобы установить данные в запросе SQL, но если пользователь изменяет выпадающий список, куки не сбрасываются с новыми данными до тех пор, пока страница не будет загружена, поэтому я буду загружать неправильные данные.
Я нашел решение, которое состоит в том, чтобы разрешить загрузку страницы, затем использовать значения полей, которые установлены правильно в этой точке, и использовать их для запроса набора данных и присвоения его GridView. Уловка, чтобы заставить это фактически отображать данные, так как страница полностью загружена в этот момент, является панелью обновления.
См. Эту статью для полного описания: http://www.aspsnippets.com/Articles/Bind-Load-GridView-after-Page-load-is-completed-using-AJAX-UpdatePanel-in-ASPNet.aspx