2010-07-13 94 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

相關問題