在SQL语句中使用user.identity.Name

时间:2015-09-25 22:07:50

标签: sql asp.net

在我的ASP.NET应用程序中,我使用以下SQL:

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

但是,我需要在Where子句中添加用户ID检查,并希望使用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'">

这是错误:

分析器错误   说明:解析为此请求提供服务所需的资源时发生错误。请查看以下特定的解析错误详细信息并相应地修改源文件。

分析程序错误消息:服务器标记格式不正确。

来源错误:

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'">

我做错了什么?

2 个答案:

答案 0 :(得分:2)

我认为你需要重新思考你的方法。而不是尝试在asp:SqlDataSource元素中“硬编码”'user.Identity.Name'属性,尝试创建一个参数来保存此值:

1)使用参数的标记替换SelectCommand中的“user.Identity.Name”,例如“@Name”。

2)然后为具有Name属性'name'的asp:SqlDataSource定义SelectParameter元素。将参数的Type属性设置为'user.Identity.Name'的数据类型。

3)然后,您可以在SqlDataSource的Selecting事件的事件处理程序中定义要以编程方式选择的值。

这是一个有效的例子。以下代码片段来自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参数;您可以将其替换为'user.Identity.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

答案 1 :(得分: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'">

更新:答案并非如此简单,正如sroonet所测试的那样。实际答案是在SelectCommand中使用参数化查询。有关在SelectCommand中使用参数化查询的详细信息,请参阅以下网页: https://msdn.microsoft.com/en-us/library/z72eefad.aspx