ASP.NET: передача внешней переменной в тег <asp: sqldatasource> ASP.NET 2.0 - PullRequest
0 голосов
/ 14 октября 2008

Я разрабатываю некий 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 ]

3 голосов
/ 14 октября 2008

Я думаю, что Oracle использует двоеточие ":", а не символ "@".


«пользователь», вероятно, зарезервированное слово. Измените его на «userID» или что-то подобное.
2 голосов
/ 14 октября 2008

Вы можете рассмотреть возможность использования SessionParameter вместо просто параметра и позволить SqlDataSource извлекать идентификатор пользователя непосредственно из сеанса без какого-либо вмешательства с вашей стороны. Кроме того, пример на странице, указанной выше, подразумевает, что вы должны использовать? вместо @user для замены параметров для соединения ODBC. Я думаю, что замена параметра будет выполняться SqlDataSource, а не передаваться в Oracle, то есть она будет заменять фактическое значение идентификатора пользователя вместо параметра (конечно, правильно указано) перед отправкой запроса в базу данных.

<SelectParameters>
  <SessionParameter Name="userID" SessionField="user" DefaultValue="" />
</SelectParameters>
0 голосов
/ 30 октября 2008
<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
0 голосов
/ 27 октября 2008

Использование SessionParameter в ASP.NET определенно является подходом - вот почему у нас это есть:)

Используя параметры ASP.NET, вы можете легко включать в свои запросы значения из статических источников, состояния сеанса, строки запроса, значений свойств элемента управления, данных публикации формы, файлов cookie и профиля пользователя.

...