2010-07-13 96 views
0

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

回答

0

在第一的getUser覆盖在那里它执行以下行:

Dim cmd As SqlCommand = New SqlCommand("Get_User", conn) 

我无法看到被执行的命令,我已经知道是难以置信的愚蠢虽然:)

也许你的代码需要通过ProviderUserKey模式遵循Get_User中的模式,我已经添加了一些缺失的事情和问题,希望这有助于。

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 
+0

嗯之后的连接位于 updateCmd.ExecuteNonQuery()后尝试 – ssez 2010-07-13 20:09:01

+0

OK,那执行你updateCmd开放的,而不是在CMD本身它正在执行。看起来你的Parameters.Add调用也有一些错误。我相信你指定了参数名称和你想分配它的值。 – 2010-07-13 20:19:46

+0

好的,所以我在添加参数后添加了cmd.ExecuteNonQuery。当我尝试选择providerUserKey时,它会出现如下所示:providerUserKey:=(我必须在表达式中输入),但是我希望它的所有操作都是抓住它,而不是指定其他内容。我只是添加变量并将它们分配给参数?并且我的Sproc中所有参数都必须在这里指定,或者只是我正在寻找的参数? – ssez 2010-07-14 12:11:03

相关问题