2015-09-25 2 views
1

В моем приложении ASP.NET, я следующий SQL, который работает:Использование Пользователь.Идентичность.Имя в заявлении SQL

<asp:SqlDataSource ID="ISESDatabase" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT [id], [Word], [Definition], [Example] FROM [gridData] WHERE [Strategy]='Vocabulary'"> 

Однако, мне нужно добавить проверку идентификатора пользователя в ИНЕКЕ, и я надеюсь использовать user.identity.Name для выполнения проверки. Я попытался следующие, но это не работает:

<asp:SqlDataSource ID="ISESDatabase" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT [id], [Word], [Definition], [Example] FROM [gridData] WHERE [userid]= /'" + user.identity.Name + "/' AND [Strategy]='Vocabulary'"> 

Здесь ошибка:

Parser Ошибка Описание: Произошла ошибка при разборе ресурса, необходимого для обслуживания этого запроса. Ознакомьтесь с приведенными ниже подробными сведениями об ошибке синтаксического анализа и соответствующим образом измените исходный файл.

Сообщение об ошибке Parser: тег сервера не очень хорошо сформирован.

Источник ошибки:

Line 46:    <asp:SqlDataSource ID="ISESDatabase" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT [id], [Word], [Definition], [Example] FROM [gridData] WHERE [userid]=/'" + User.Identity.Name + "/' AND [Strategy]='Vocabulary'"> 

Что я делаю неправильно?

+0

Почему вы окружая usename с '/' S? – Mureinik

+0

Убрано и получило следующую ошибку: Ошибка Parser Описание: Произошла ошибка во время разбора ресурса, необходимого для обслуживания этого запроса. Ознакомьтесь с приведенными ниже подробными сведениями об ошибке синтаксического анализа и соответствующим образом измените исходный файл. Сообщение об ошибке Parser: тег сервера не очень хорошо сформирован. Строка 46: sroonet

ответ

1

Я думаю, вам нужно переосмыслить свой подход. Вместо того, чтобы пытаться «жестко закодировать» свойство «user.Identity.Name» в элементе asp: SqlDataSource, попробуйте создать параметр для хранения этого значения:

1) Замените 'user.Identity.Name' в своем SelectCommand с токеном для параметра, например, «@Name».

2) Затем определите элемент SelectParameter для asp: SqlDataSource, у которого есть свойство Name 'Name'. Задайте свойство Type этого параметра как тип данных 'user.Identity.Name'.

3) Затем вы можете определить значение, которое вы хотите программно выбрать в обработчике событий для события выбора SqlDataSource.

Вот пример, который работает. Следующий фрагмент кода со страницы ASPX:

<asp:GridView ID="myGridView" runat="server" DataSourceID="myDataSource" DataKeyNames="ID"></asp:GridView> 
<asp:SqlDataSource ID="myDataSource" runat="server" 
    SelectCommand="SELECT * FROM [Users] WHERE [Name] = @Name" 
    ConnectionString='Data Source=(LocalDB)\v11.0;AttachDbFilename="c:\users\windowsLogin\documents\visual studio 2012\Projects\WebApplication1\WebApplication1\App_Data\Database1.mdf";Integrated Security=True'> 
    <SelectParameters> 
     <asp:Parameter Name="Name" Type="Int32" /> 
    </SelectParameters> 
</asp:SqlDataSource> 

Затем в коде-позади, вы можете определить параметры программно во время выполнения на основе независимо от критериев значения. (Здесь, я просто присваивая значение «2» для параметра @name;. Вы можете заменить его «Пользователь.Идентичность.Имя»)

Private Sub myDataSource_Selecting(sender As Object, e As SqlDataSourceSelectingEventArgs) Handles myDataSource.Selecting 
    e.Command.Parameters("@Name").Value = 2 
End Sub 

Я надеюсь, что это понятно ... Если нет , обратитесь к документации по MSDN.Вот несколько страниц, чтобы вы начали:

SqlDataSource.SelectCommand Property

SqlDataSourceSelectingEventArgs Class

и, в более общем плане,

Using Parameters with Data Source Controls for Filtering

+0

Спасибо, Джеймс. Ты жжешь! – sroonet

+0

Хорошо продуманный ответ. Спасибо. – Tyddlywink

0

Чтобы избежать специального символа в строке, используйте обратную косую черту '\', а не косую черту '/'. Попробуйте это и посмотреть, если он работает:

<asp:SqlDataSource ID="ISESDatabase" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT [id], [Word], [Definition], [Example] FROM [gridData] WHERE [userid]= \'" + user.identity.Name + "\' AND [Strategy]='Vocabulary'"> 

UPDATE: Ответ не так прост, как проверено sroonet. Фактический ответ заключается в использовании параметризованного запроса в SelectCommand. Подробнее об использовании параметризованного запроса в SelectCommand см. На следующей веб-странице: https://msdn.microsoft.com/en-us/library/z72eefad.aspx

+0

внесли ваши предлагаемые изменения, теперь получите: Ошибка Parser Описание: Произошла ошибка во время разбора ресурса, необходимого для обслуживания этого запроса. Ознакомьтесь с приведенными ниже подробными сведениями об ошибке синтаксического анализа и соответствующим образом измените исходный файл. Сообщение об ошибке Parser: тег сервера не очень хорошо сформирован. Строка 46: sroonet

+0

Хорошо, я провел некоторое исследование, и проблема не так проста. В принципе, вы не можете выполнять конкатенацию строк в свойстве SelectCommand в соответствии с этой ссылкой (http://stackoverflow.com/questions/1112371/net-sqldatasource-tag-selectcommand). Вы можете попробовать следующее: https://msdn.microsoft.com/en-us/library/z72eefad.aspx использовать параметризованный запрос. –

+0

Спасибо, Генри. Параметризованные запросы сделали трюк. – sroonet

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