Vb.net 如何从数据库中提取GUID以更新用户名
我有一个不同于ASP.net中的SQL数据库,因此我必须创建一个自定义成员资格提供程序。获取用户的提供程序如下所示: 我的SQL类名是CustomSqlProvider:Vb.net 如何从数据库中提取GUID以更新用户名,vb.net,guid,Vb.net,Guid,我有一个不同于ASP.net中的SQL数据库,因此我必须创建一个自定义成员资格提供程序。获取用户的提供程序如下所示: 我的SQL类名是CustomSqlProvider: Public Overrides Function GetUser(ByVal username As String, _ ByVal userIsOnline As Boolean) As MembershipUser 'Dim connectionString As String = "Server=***
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以进行更改。我正在使用一个存储过程来更新Users表
页面上有以下代码,我可以在其中更改凭据:
Dim currentUser as MembershipUser=Membership.GetUser()
Dim CurrentUSerId作为Guid=CType(currentUser.ProviderUserKey,Guid)
我获取的引用未设置为对象的实例。任何帮助都将不胜感激
谢谢你的编辑。我还添加了get和set属性,以便能够向这些参数添加值。Update_User存储过程中的参数是输入。我的Get_User存储过程如下..这就是为什么我认为它没有获取GUID的原因,因为它在运行时要求输入用户名和密码,然后返回所有内容,包括GUID:
GO
/****** Object: StoredProcedure [dbo].[Get_User] Script Date: 07/14/2010 09:16: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 WHERE USER_NAME = @UserName AND PWD = @Password
RETURN
///////////////////////////////////////////////////////////////////////////////////////////
在添加这些get和set并将参数变量分配给存储过程参数后,出现以下错误:
引用未设置为对象的实例
在这一行代码中:
Dim currentUser As MembershipUser = Membership.GetUser()
Dim UserId As Guid = CType(currentUser.ProviderUserKey, Guid)
这是我在UserInfo.aspx.vb页面上的按钮点击下的内容:
Dim sql As New SqlClient.SqlCommand("Update_User", con)
sql.Parameters.Add("@UserId", SqlDbType.UniqueIdentifier).Value = UserId
sql.Parameters.Add("@UserName", SqlDbType.NVarChar).Value = txtUserName.Text
在第一个GetUser覆盖中,它在何处执行以下行:
Dim cmd As SqlCommand = New SqlCommand("Get_User", conn)
我看不到命令是否被执行,但大家都知道我非常愚蠢:)
也许您的代码需要遵循Get_User by ProviderUserKey模式中的模式,我已经添加了一些缺少的内容和问题,希望这对您有所帮助
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).Value = "??????"
cmd.Parameters.Add(("@Password", SqlDbType.NVarChar).Value = "??????"
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)
'Are these input or output parameters?
updateCmd.Parameters.Add("@UserName", SqlDbType.NVarChar).Value = u.UserName
updateCmd.Parameters.Add("@F_Name", SqlDbType.NVarChar).Value = "??????"
updateCmd.Parameters.Add("@L_Name", SqlDbType.NVarChar).Value = "??????"
updateCmd.Parameters.Add("@PWD", SqlDbType.VarChar).Value = "??????"
updateCmd.Parameters.Add("@Email", SqlDbType.VarChar).Value = "??????"
updateCmd.ExecuteNonQuery()
End If
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
嗯,它是在连接在updateCmd打开后执行的。在Tryok之后的ExecuteNonQuery()执行updateCmd,而不是cmd本身。您的参数似乎有一些错误。请添加调用。我相信您已经指定了参数名和要分配的值。好的,所以我在添加参数之后添加了cmd.ExecuteNonQuery。当我尝试选择providerUserKey时,结果是这样的:providerUserKey:=(我必须在其中放入一个表达式),但我想要它做的只是获取它,而不是指定其他内容。我是否只是添加变量并将其分配给参数?我的存储过程中的所有参数都必须在这里指定,还是只指定我正在查找的参数?另外,我注意到在您编辑的代码中,您不能执行reader.ExecuteNonQuery,因为作为SqlDataReader,它只能执行reader属性。但也许ExecuteOnQuery就是我所需要的,除非我把它放在parameters.oops,my bad:)后面,否则它不会工作。你应该使用ExecuteReader。您需要检索成员资格用户以填充update命令的字段。这不是实现这一目标的最佳方式,但会奏效