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 и профиля пользователя.

Другие вопросы по тегам