2012-09-28 2 views
1

я написал следующую функцию для проверки журнала в данных для пользователя, но до сих пор его не работает должным образом, и я уверен, что есть что-то не так с ним:Проверьте регистрационные данные от имени пользователя и пароля столбцов

Private Sub button2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles button2.Click 
    If loginpasswordtx.Text.Length > 1 And loginpasswordtx.Text.Length > 1 And My.Settings.SQLConnectionString.Length > 5 Then 
     Try 
      Dim cnn As New SqlConnection(My.Settings.SQLConnectionString) 
      Dim cmd = New SqlCommand("SELECT AppUser,AppUserPass FROM OrderAppUsers WHERE [email protected] AND [email protected]", cnn) 
      cmd.Parameters.Add(New SqlParameter("@AppUser", createuserAppUser.Text)) 
      cmd.Parameters.Add(New SqlParameter("@AppUserPass", MD5StringHash(loginpasswordtx.Text))) 
      cnn.Open() 

      Dim obj As Object = cmd.ExecuteScalar() 
      If obj = Nothing Then 
       MsgBox("Faild to Log in, check your log in info") 
       cnn.Close() 
       Return 
      End If 
      cnn.Close() 
     Catch ex As SqlException 
      MsgBox(ex.Message) 
      Return 
     End Try 

     MsgBox("Logged in Successfully") 
    End If 
End Sub 

Все, что я получаю, это null obj, хотя пользователь и пароль существуют в таблице.

следующий код для добавления новых пользователей

Try 
      Dim cnnstring As String = String.Format("Server={0};Database={1};Trusted_Connection=True;", createuserServerTx.Text, createuserDatabaseTx.Text) 
      Dim cnn As New SqlConnection(cnnstring) 
      Dim cmd As New SqlCommand("INSERT INTO OrderAppUsers VALUES (@AppUser, @AppUserPass)", cnn) 
      cmd.Parameters.Add(New SqlParameter("@AppUser", createuserAppUser.Text)) 
      cmd.Parameters.Add(New SqlParameter("@AppUserPass", MD5StringHash(createuserpassword.Text))) 
      cnn.Open() 
      cmd.ExecuteNonQuery() 
      cnn.Close() 
      MsgBox("User Crated Successfully") 
      LayoutControl1.Visibility = Windows.Visibility.Collapsed 
      My.Settings.SQLConnectionString = cnnstring 
      My.Settings.Save() 
     Catch ex As SqlException 
      MsgBox(ex.Message) 
     End Try 

и функции для создания обычай окрошка

Private Function MD5StringHash(ByVal strString As String) As String 
    Dim MD5 As New MD5CryptoServiceProvider 
    Dim Data As Byte() 
    Dim Result As Byte() 
    Dim R As String = "" 
    Dim Temp As String = "" 

    Data = Encoding.ASCII.GetBytes(strString) 
    Result = MD5.ComputeHash(Data) 
    For i As Integer = 0 To Result.Length - 1 
     Temp = Hex(3 * Result(i) + 1) 
     If Len(Temp) = 1 Then Temp = "0" & Temp 
     R += Temp 
    Next 
    Return R 
End Function 

ответ

1

Попробуйте выполнить следующие действия при добавлении параметру

cmd.Parameters.AddWithValue("@AppUser", createuserAppUser.Text) 
cmd.Parameters.AddWithValue("@AppUserPass", MD5StringHash(loginpasswordtx.Text)) 

или просто придерживаться с тем, что вы сделали, но немного отличается от вашего,

cmd.Parameters.Add("@AppUser", SqlDbType.VarChar)  
cmd.Parameters("@AppUser").Value = createuserAppUser.Text 
cmd.Parameters.Add("@AppUserPass", SqlDbType.VarChar)  
cmd.Parameters("@AppUserPass").Value = MD5StringHash(loginpasswordtx.Text) 

между прочим, при использовании ExecuteScalar() он только возвращает одиночное значение. Таким образом, ваш запрос может быть записан в виде

SELECT COUNT(*) 
FROM OrderAppUsers 
WHERE [email protected] AND [email protected] 

и вы можете использовать int переменные для хранения его значения

Dim obj As int = Cint(cmd.ExecuteScalar()) 

поэтому возможные значения 0 или общее количество записей вернуться.

If obj = 0 Then 
    MsgBox("Faild to Log in, check your log in info") 
    '' other codes 
End If 

и refractoring код, используйте Using -Statement

Using cnn As New SqlConnection(My.Settings.SQLConnectionString) 
    Using cmd = New SqlCommand("SELECT COUNT(*) FROM OrderAppUsers WHERE [email protected] AND [email protected]", cnn) 
     cmd.Parameters.AddWithValue("@AppUser", createuserAppUser.Text) 
     cmd.Parameters.AddWithValue("@AppUserPass", MD5StringHash(loginpasswordtx.Text)) 
     cmd.CommandType = CommandType.Text 
     Try 
      cnn.Open() 
      Dim obj As int = Cint(cmd.ExecuteScalar()) 
      If obj = 0 Then 
       MsgBox("Faild to Log in, check your log in info") 
      Else 
       MsgBox("Logged in Successfully") 
      End If 
     Catch(ex As SqlException) 
      MsgBox(ex.Message.ToString()) 
     End Try 
    End Using 
End Using 
+0

все еще та же проблема, и я не могу понять, что не так, забавная вещь, это работает только тогда, когда я создаю ne w и попробуйте войти в систему, после того, как я закрою приложение и попробую снова войти в систему с тем же пользователем, он говорит: «Faild для входа в систему, проверьте свою информацию в журнале», я добавил код, как добавить пользователя в databae в вопросе – user1570048

+0

@ user1570048 вы проверили базу данных, если вставка прошла успешно? –

+0

yes all perfect – user1570048

0

Я проверил ваш код в моей локальной системе, и она работает нормально я имею в виду я был в состоянии проверить его возвращение истинного анализа я и нашел свое return false только тогда, когда я добавляю одно пространство в текст пароля перед тем, как шифровать, можно проверить значение базы данных, добавив пробел в значение пароля или вы можете отправить свой код шифрования

+0

отлично, у меня есть функция для генерации настраиваемого хеша пароля на вопрос, можете ли вы проверить его, если он работает с этой функцией? – user1570048

Смежные вопросы