我有一個SQL數據庫與ASP.net中的數據庫不同,因此我必須創建一個自定義成員資格提供程序。獲得用戶的提供商是這樣的: 我的SQL類名稱爲CustomSqlProvider:如何從我的數據庫中提取GUID以更新用戶名
Public Overrides Function GetUser(ByVal username As String, _
ByVal userIsOnline As Boolean) As MembershipUser
'Dim connectionString As String = "Server=***;Database=***;User Id=***password=****"'
Dim conn As SqlConnection = New SqlConnection(connectionString)
Dim cmd As SqlCommand = New SqlCommand("Get_User", conn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@UserName", SqlDbType.NVarChar)
cmd.Parameters.Add("@Password", SqlDbType.NVarChar)
Dim u As MembershipUser = Nothing
Dim reader As SqlDataReader = Nothing
Try
conn.Open()
If userIsOnline Then
Dim updateCmd As SqlCommand = New SqlCommand("Update_User", conn)
updateCmd.Parameters.Add("@UserName", SqlDbType.NVarChar)
updateCmd.Parameters.Add("@F_Name", SqlDbType.NVarChar)
updateCmd.Parameters.Add("@L_Name", SqlDbType.NVarChar)
updateCmd.Parameters.Add("@PWD", SqlDbType.VarChar)
updateCmd.Parameters.Add("@Email", SqlDbType.VarChar)
updateCmd.ExecuteNonQuery()
End If
Catch e As SqlException
'If WriteExceptionsToEventLog Then
' WriteToEventLog(e, "Get_User, as String")
' Throw New ProviderException(exceptionMessage)
'Else
'Throw e
'End If
Finally
If Not reader Is Nothing Then reader.Close()
conn.Close()
End Try
Return u
End Function
Public Overrides Function GetUser(ByVal providerUserKey As Object, _
ByVal userIsOnline As Boolean) As MembershipUser
Dim conn As SqlConnection = New SqlConnection(connectionString)
Dim cmd As SqlCommand = New SqlCommand("Get_User", conn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@UserId", SqlDbType.UniqueIdentifier).Value = providerUserKey
Dim u As MembershipUser = Nothing
Dim reader As SqlDataReader = Nothing
Try
conn.Open()
reader = cmd.ExecuteReader()
If reader.HasRows Then
reader.Read()
u = GetUserFromReader(reader)
If userIsOnline Then
Dim updateCmd As SqlCommand = New SqlCommand("Update_User", conn)
updateCmd.Parameters.Add("@UserId", SqlDbType.UniqueIdentifier)
updateCmd.ExecuteNonQuery()
End If
End If
Catch e As SqlException
If WriteExceptionsToEventLog Then
WriteToEventLog(e, "GetUser(Object, Boolean)")
Throw New ProviderException(exceptionMessage)
Else
Throw e
End If
Finally
If Not reader Is Nothing Then reader.Close()
conn.Close()
End Try
Return u
End Function
現在我想做的事就是我第一次登錄到我的網站,它驗證,我在我那麼重定向到另一個頁面,我可以更改我的用戶名。但我似乎無法獲取登錄用戶的GUID以便更改它。我正在使用更新用戶表的存儲過程。
我有頁面,我可以改變憑證上下面的代碼:
昏暗currentUser爲=的MembershipUser Membership.GetUser() 昏暗CurrentUSerId作爲的Guid = CTYPE(currentUser.ProviderUserKey,GUID)
我沒有將參考設置爲對象的實例。任何幫助,將不勝感激。
感謝您的編輯。我還添加了獲取和設置屬性,以便我可以爲這些參數添加值。 Update_User sproc中的參數是輸入。我的Get_User sproc看起來像這樣..這就是爲什麼我認爲它沒有得到GUID,因爲它運行時它要求輸入用戶名和密碼,然後它返回包括Guid在內的所有內容:
GO /*** ***對象:StoredProcedure的[DBO] [GET_USER]腳本日期:07/14/2010 9時十六分17秒******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [DBO ] [GET_USER] @UserName爲nvarchar(50), @Password VARCHAR(50) AS SELECT USER_ID,USER_NAME,F_NAME,L_NAME,BUILDING_ID,SIP_ROLE,INTERNAL_ID,PWD,EMAIL FROM dbo.USERS其中user_name = @UserName一個D PWD = @Password RETURN
/////////////////// ////////////////////////////////////////////////// //
在添加這些獲取並設置參數變量並將其分配給我的Sproc參數後,出現以下錯誤:「引用未設置爲對象的實例」。在這行代碼:
昏暗currentUser由於=的MembershipUser Membership.GetUser() 昏暗的userid =的Guid CTYPE(currentUser.ProviderUserKey,GUID)
而這就是我對UserInfo.aspx。下面的按鍵點擊VB頁:
昏暗的SQL作爲新SqlClient.SqlCommand( 「Update_User」,CON) sql.Parameters.Add( 「@用戶ID」,SqlDbType.UniqueIdentifier).value的用戶ID = sql.Parameters。添加(「@ UserName」,SqlDbType.NVarChar).Value = txtUserName。文字
嗯之後的連接位於 updateCmd.ExecuteNonQuery()後嘗試 – ssez 2010-07-13 20:09:01
OK,那執行你updateCmd開放的,而不是在CMD本身它正在執行。看起來你的Parameters.Add調用也有一些錯誤。我相信你指定了參數名稱和你想分配它的值。 – 2010-07-13 20:19:46
好的,所以我在添加參數後添加了cmd.ExecuteNonQuery。當我嘗試選擇providerUserKey時,它會出現如下所示:providerUserKey:=(我必須在表達式中輸入),但是我希望它的所有操作都是抓住它,而不是指定其他內容。我只是添加變量並將它們分配給參數?並且我的Sproc中所有參數都必須在這裏指定,或者只是我正在尋找的參數? – ssez 2010-07-14 12:11:03