Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何从数据库中提取GUID以更新用户名_Vb.net_Guid - Fatal编程技术网

Vb.net 如何从数据库中提取GUID以更新用户名

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=***

我有一个不同于ASP.net中的SQL数据库,因此我必须创建一个自定义成员资格提供程序。获取用户的提供程序如下所示: 我的SQL类名是CustomSqlProvider:

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命令的字段。这不是实现这一目标的最佳方式,但会奏效