ASP.NET: передача внешней переменной в тег <asp: sqldatasource> ASP.NET 2.0
Я разрабатываю некоторые ASP.NET 2.0 на основе VB и стараюсь больше использовать различные теги ASP, которые предоставляет Visual Studio, а не писать все вручную в коде. Я хочу передать внешнюю переменную из сеанса, чтобы определить, кто является пользователем для запроса.
<asp:sqldatasource id="DataStores" runat="server" connectionstring="<%$ ConnectionStrings:MY_CONNECTION %>"
providername="<%$ ConnectionStrings:MY_CONNECTION.ProviderName %>"
selectcommand="SELECT THING1, THING2 FROM DATA_TABLE WHERE (THING2 IN (SELECT THING2 FROM RELATED_DATA_TABLE WHERE (USERNAME = @user)))"
onselecting="Data_Stores_Selecting">
<SelectParameters>
<asp:parameter name="user" defaultvalue ="" />
</SelectParameters>
</asp:sqldatasource>
И в моем коде есть:
Protected Sub Data_Stores_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles Data_Stores.Selecting
e.Command.Parameters("user").Value = Session("userid")
End Sub
Oracle кричит на меня с ORA-01036, недопустимым именем переменной. Я объявляю переменную неправильно в запросе?
Я думал, что внешние переменные имеют одинаковое имя с префиксом @. из того, что я понимаю, это должно быть помещение нужного значения в запрос при выполнении выбора.
РЕДАКТИРОВАТЬ: Хорошо, спасибо за совет, первая ошибка была исправлена, мне нужно использовать: а не @ для объявления переменной в запросе. Теперь он генерирует недопустимое имя переменной хоста / связывания ORA-01745.
ИЗМЕНИТЬ СНОВА: Хорошо, похоже, что пользователь был зарезервированным словом. Это работает сейчас! Спасибо за другие точки зрения на этот. Я не думал об этом подходе.
4 ответа
Я считаю, что Oracle использует двоеточие ":", а не символ "@".
"пользователь", вероятно, зарезервированное слово. Измените его на "userID" или что-то подобное.
Вы можете рассмотреть возможность использования SessionParameter вместо просто Parameter и позволить SqlDataSource извлекать идентификатор пользователя непосредственно из сеанса без какого-либо вмешательства с вашей стороны. Кроме того, пример на странице, указанной выше, подразумевает, что вы должны использовать? вместо @user для замены параметров для соединения ODBC. Я думаю, что замена параметра будет выполняться SqlDataSource, а не передаваться в Oracle, то есть она будет заменять фактическое значение идентификатора пользователя вместо параметра (конечно, правильно указано) перед отправкой запроса в базу данных.
<SelectParameters>
<SessionParameter Name="userID" SessionField="user" DefaultValue="" />
</SelectParameters>
<asp:sqldatasource id="DataStores" runat="server" connectionstring="<%$ ConnectionStrings:MY_CONNECTION %>"
providername="<%$ ConnectionStrings:MY_CONNECTION.ProviderName %>"
selectcommand="SELECT THING1, THING2 FROM DATA_TABLE WHERE (THING2 IN (SELECT THING2 FROM RELATED_DATA_TABLE WHERE (USERNAME = @user)))"
onselecting="NAME_OF_SUB_Selecting">
<SelectParameters>
<asp:parameter name="@user1" defaultvalue ="" />
</SelectParameters>
</asp:sqldatasource>
Protected Sub NAME_OF_SUB_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles Data_Stores.Selecting
e.Command.Parameters("@user1").Value = Membership.GetUser.ProviderUserKey.ToString()
End Sub
Использование SessionParameter в ASP.NET определенно является подходом - вот почему у нас это есть:)
Используя параметры ASP.NET, вы можете легко включить в свои запросы значения из статических источников, состояния сеанса, строки запроса, значений свойств элемента управления, данных публикации формы, файлов cookie и профиля пользователя.