我有一个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