2011-03-27 118 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; 
    }