2011-03-27 124 views
4

我需要(我认为)获取当前登录的用户ID,以便我可以更新我的表中的一个使用此用户ID作为外键。问题是,在数据库中的用户ID不匹配这样的:asp.net会员供应商guid userID

Guid currentUser = (Guid)Membership.GetUser().ProviderUserKey; 
currentUser.toString(); 

结果dffaca0c-ae0b-8549-8073-1639985740be

而当我看到在数据库中,它是0CCAFADF0BAE498580731639985740BE

他们为什么不同的价值? (我只有一个用户)。我正在使用asp.net的oracle数据库和提供程序,但不应该有任何区别。

+0

尝试提供'Page.User.Identity.Name'到'的getUser()'方法,而不是使用默认值。 – 2011-03-27 04:25:40

回答

6

我相信这些是相同的值,但显示顺序是不同的。综观2个值:

dffaca0c-ae0b-8549-8073-1639985740be 
0CCAFADF-0BAE-4985-8073-1639985740BE 

前3段的字节排序是不同的顺序的:

0CCA FADF => FADF 0CCA => DFFA CA0C == dffaca0c 

0BAE => AE 0B == ae0b 

4985 => 85 49 == 8549 

作为@ x0n注释,这看起来像在端序与Oracle的差。根据该结构的this description,前8个字节的字节顺序依赖于系统,而最后8个字节的字节顺序特别是大端字节。

+1

oracle上的endian差异? – x0n 2011-03-27 04:36:56

+0

是的:)现在我必须弄清楚为什么是这种情况。嗯,可能是oracle如何在数据库中存储值... – BobTurbo 2011-03-27 04:37:46

0

或者也可以尝试使用HttpContext.Curent.User获取当前用户?

0

您始终可以使用小写用户名列创建外键。它总是独一无二的。也许不是最好的选择,但它是最简单的,运作良好。我已经在几个项目中使用过它。

3

我有同样的问题,并与这里面解决了这个问题上来:

public static string TranslateOraceEndianUserID() 
    { 
     MembershipUser myObject = Membership.GetUser(); 
     Guid g = new Guid(myObject.ProviderUserKey.ToString()); 
     byte[] b = g.ToByteArray(); 
     string UserID = BitConverter.ToString(b, 0).Replace("-", string.Empty); 
     return UserID; 
    }