【问题标题】:ASP .Net Get Current User ID from SQL Server Compact databaseASP .Net 从 SQL Server Compact 数据库中获取当前用户 ID
【发布时间】:2013-06-23 15:18:41
【问题描述】:

我有一个页面,我正在尝试识别当前用户的 id 键,以便我可以插入新表的附加信息。我已经包含了在 SQL Server Express 中工作的页面的代码,但我认为在绑定上存在一个参考问题,以识别 @UserID

有什么想法吗?

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" Title="Untitled Page" %>

<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.Configuration" %>

<%@ Import Namespace="System.Data.SqlServerCe" %>

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Linq" %>
<%@ Import Namespace="System.Web" %>
<%@ Import Namespace="System.Web.Security" %>
<%@ Import Namespace="System.Web.UI" %>
<%@ Import Namespace="System.Web.UI.HtmlControls" %>
<%@ Import Namespace="System.Web.UI.WebControls" %>
<%@ Import Namespace="System.Web.UI.WebControls.WebParts" %>
<%@ Import Namespace="System.Xml.Linq" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Security.Permissions" %>

<script language="c#" runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {


    }

    protected void UserProfileDataSource_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
    {

        //MembershipUser user = Membership.GetUser();
        //string UserID = user.ProviderUserKey.ToString();
        //e.Command.Parameters["@UserId"].Value = UserID;

        // 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;
    }

    protected void UserProfile_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e)
    {
        SettingsUpdatedMessage.Visible = true;
    }
</script>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
    <h2>Update Your Settings</h2>
    <p>
        <asp:Label ID="SettingsUpdatedMessage" runat="server" Text="Your settings have been updated." EnableViewState="false" Visible="false"></asp:Label>
    </p>

    <!-- 
             ProviderName="System.Data.SqlServerCe.4.0" -->
    <asp:DetailsView ID="UserProfile" runat="server" 
        AutoGenerateRows="False" DataKeyNames="UserId" 
        DataSourceID="UserProfileDataSource" DefaultMode="Edit" 
        onitemupdated="UserProfile_ItemUpdated">
        <Fields>
            <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:DefaultConnection %>" 
             ProviderName="<%$ ConnectionStrings:DefaultConnection.ProviderName %>"
        SelectCommand="SELECT [UserId], [HomeTown], [HomepageUrl], [Signature] FROM [UserProfiles] WHERE ([UserId] = @UserId)" 
        onselecting="UserProfileDataSource_Selecting" UpdateCommand="UPDATE UserProfiles SET
    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>
</asp:Content>

我不断收到错误:

System.ArgumentException:不存在从 DbType 对象到已知 SqlDbType 的映射。

我认为它与UserProfileDataSource_Selecting 有关,但我不确定。我找不到要使用的等效 SQL Server CE 参考。

【问题讨论】:

  • 似乎 CE msdn.microsoft.com/en-us/library/… 支持的 GUID 没有 SqlDbType
  • 我认为这是可能的。感谢您提供链接,但我不太确定如何实施您的建议。您是否介意根据上面提供的代码显示一个关于实现的小脚本。感谢您的帮助

标签: c# asp.net sql-server-ce


【解决方案1】:

基于Managed Data Type Mappings (SQL Server Compact)SQL Server Data Type Mappings 相比,Object 似乎不是有效的DbType 并且不能映射到 SQL Server Compact 中的SqlDbType(但在 SqlServer 中有效)。

由于 UseridGuid,请尝试替换:

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

与:

<SelectParameters>
   <asp:Parameter Name="UserId" DbType="Guid" />
</SelectParameters>
<UpdateParameters>
   <asp:Parameter Name="HomeTown" />
   <asp:Parameter Name="HomepageUrl" />
   <asp:Parameter Name="Signature" />
   <asp:Parameter Name="UserId" DbType="Guid" />
</UpdateParameters>

【讨论】:

  • 谢谢,这样做我得到了这个错误:“不能从它的字符串表示 'Guid' 为 'Type' 属性创建一个类型为 'System.TypeCode' 的对象。AdditionalUserInfo.aspx”
  • System.Guid?不确定我是否关注你。对不起...不要试图密集。这不起作用:
  • 也不起作用
  • 克里斯,这似乎已经解决了错误。当用户进入数据库时​​,他们没有此记录的值。如果 select 语句的记录数为零,有没有办法显示表单?现在,页面即将出现(意味着没有错误),但它在正文中完全是空白的(意味着没有表单值)。我确实通过几个登录名登录过。表格出现的唯一一个是我自己在个人资料中输入的附加用户信息。如果数据当前不存在,则无法向此表单添加新信息。
  • @user2511441 你能用 sqlserver 做到这一点吗?我已经重新更新了我的答案,因为可能更新命令也失败了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
相关资源
最近更新 更多