【问题标题】:A field or property with the name 'Username' was not found on the selected data source在所选数据源上找不到名为“用户名”的字段或属性
【发布时间】:2012-07-01 04:29:03
【问题描述】:

我正在使用 SqlDataSource 为 userprofile 绑定 DetailsView,它允许用户查看他们的信息并同时更改他们的详细信息。 (选择、检索和更新)

但是,发生了这个错误——当我单击超链接指向“用户配置文件”页面时,在所选数据源上找不到名为“用户名”的字段或属性。

Exception Details: System.Web.HttpException: A field or property with the name 'Username' was not found on the selected data source.

Source Error: 

An unhandled exception was generated during the execution of the current web request.   Information regarding the origin and location of the exception can be identified using the   exception stack trace below.

这是 userprofile.aspx 文件中的代码:

  <asp:DetailsView ID="UserProfile" runat="server" 
        AutoGenerateRows="False" DataKeyNames="UserId" 
        DataSourceID="UserProfileDataSource" DefaultMode="Edit" 
        onitemupdated="UserProfile_ItemUpdated">
        <Fields>
           <asp:BoundField DataField="Username" HeaderText="Username" 
                SortExpression="Username" />
            <asp:BoundField DataField="HomeTown" HeaderText="HomeTown" 
                SortExpression="HomeTown" />
            <asp:BoundField DataField="HomepageUrl" HeaderText="HomepageUrl" 
                SortExpression="HomepageUrl" />
            <asp:BoundField DataField="Signature" HeaderText="Signature" 
                SortExpression="Signature" />
            <asp:CommandField ShowEditButton="True" />
        </Fields>
    </asp:DetailsView>

    <asp:SqlDataSource ID="UserProfileDataSource" runat="server" 
        ConnectionString="<%$ ConnectionStrings:SecurityTutorialsConnectionString %>" 

        SelectCommand="SELECT * FROM [UserProfiles] WHERE ([UserId] = @UserId)" 
        onselecting="UserProfileDataSource_Selecting" 
        UpdateCommand="UPDATE UserProfiles SET
        Username = @Username,
        HomeTown = @HomeTown,
        HomepageUrl = @HomepageUrl,
        Signature = @Signature   WHERE UserId = @UserId ">

        <SelectParameters>
        <asp:Parameter Name="UserId" Type="Object" />
        </SelectParameters>
        <UpdateParameters>
            <asp:Parameter Name="HomeTown" />
            <asp:Parameter Name="HomepageUrl" />
            <asp:Parameter Name="Signature" />
            <asp:Parameter Name="UserId" />
        </UpdateParameters>
    </asp:SqlDataSource>

这是 userprofile.aspx.cs 背后的代码:

 protected void UserProfileDataSource_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
    {
        // Get a reference to the currently logged on user
        MembershipUser currentUser = Membership.GetUser();

        // Determine the currently logged on user's UserId value
        Guid currentUserId = (Guid)currentUser.ProviderUserKey;

        // Assign the currently logged on user's UserId to the @UserId parameter
        e.Command.Parameters["@UserId"].Value = currentUserId;
    }

编辑 我已将 SQL 查询更改为:

 SelectCommand= "SELECT [aspnet_Membership].UserId, [HomeTown], [HomepageUrl], [Signature] FROM [UserProfiles] INNER JOIN [aspnet_Membership] ON aspnet_Membership.UserId = UserProfiles.UserId WHERE aspnet_Membership.UserId=@UserId"
    onselecting="UserProfileDataSource_Selecting"
    UpdateCommand="UPDATE UserProfiles SET
    Username = @Username,
    HomeTown = @HomeTown,
    HomepageUrl = @HomepageUrl,
    Signature = @Signature   WHERE UserId = @UserId ">

但错误依旧出现: 在所选数据源中找不到名为“用户名”的字段或属性

【问题讨论】:

    标签: c# asp.net sql-server


    【解决方案1】:

    检查 UserProfiles 表中的字段名称。看来您没有用户名字段。明确声明要选择的字段而不是使用 SELECT * FROM .. 语法是一种很好的做法。

     <asp:BoundField DataField="Username" HeaderText="Username"  
                    SortExpression="Username" /> 
    

    【讨论】:

    • 是因为用户名是外键,所以它触发了这个错误? hometown、homepageurl 和 signature 都属于同一个名为“UserProfiles”的表。而用户名来自与登录控件一起创建的 aspnet_membership 表。
    • @user1467175 - 如果您想显示或使用另一个表中的数据,您必须将这两个表连接在一起。由于您没有将 aspnet_membership 表作为 SELECT 的一部分,因此您无法访问其中的任何数据。
    • 所以它应该类似于 SELECT [m.UserId], [HomeTown], [HomepageUrl], [Signature] FROM [aspnet_Membership m] INNER JOIN [UserProfiles u] ON m.UserId = u。用户 ID ??
    • @user1467175 - 接近于:SELECT m.UserName, u.HomeTown, u.HomepageUrl, u.Signature FROM aspnet_Membership m INNER JOIN UserProfiles u ON m.UserId = u.UserId
    【解决方案2】:

    您能否尝试重新排序字段以查看是否只是用户名的问题?即,

    <asp:BoundField DataField="HomeTown" HeaderText="HomeTown" 
                    SortExpression="HomeTown" />
    <asp:BoundField DataField="Username" HeaderText="Username" 
                    SortExpression="Username" />
    

    如果数据源有问题,您现在应该在“HomeTown”上获得异常。如果这样做,可以尝试的一件事是从参数分配中删除 @:

    e.Command.Parameters["UserId"].Value = currentUserId;
    

    编辑:看到你修改的 SQL 后,有两件事:

    1. 在您的 SelectCommand 中,您似乎没有选择用户名。如果[aspnet_Membership].UserId是你的用户名,你可以SELECT [aspnet_Membership].UserId AS Username
    2. 在您的 UpdateCommand 中,您正在为 Username 分配一个值,即使它在 UserProfiles 表中不存在。您还需要在那里使用 JOIN。

    【讨论】:

    • 您好,如果我在用户名字段中添加后才在用户名字段中添加,则代码运行良好,然后出现此错误。
    • 好的,根据您对 DaveB 的回复,听起来您遇到了不同的问题。我会建议明确选择您想要的字段,而不是使用 * 通配符。那么您的错误将显示为源自 SQL 语句。
    猜你喜欢
    • 2014-07-15
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多