2015-08-27 2 views
0

Итак, теперь я, вероятно, имел небольшой опыт работы с программированием баз данных и просто SQL в целом, поэтому, если то, что я говорю, не пугает, я извиняюсь. Я пытаюсь создать форму входа, которая обращается к моей таблице базы данных и сравнивает то, что Пользователь написал в самой таблице. После неустанного поиска в Интернете я не могу понять, почему Код, который я написал, не может прочитать таблицу. вот пример, может быть, кто-то может помочь мне понять мою проблему?Сравнение переменной String с таблицей SQL VB.Net

Public Function CompareDbValues(Compare_1 As String) 
    Using connection As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\User\OneDrive\Software\WindowsApplication1\WindowsApplication1\Database1.mdf;Integrated Security=True") 
     connection.Open() 

     Dim sSQL As String = "SELECT UserName, Password FROM [Table] WHERE UserName = 'Me.UserName.Text' AND Password = 'Me.Password.Text'" 
     Using Command As New SqlCommand(sSQL, connection) 
      Dim Reader As SqlDataReader 
      Reader = Command.ExecuteReader() 

      If Reader.HasRows Then 
       Do While Reader.Read() 
        If Compare_1 = Reader("UserName").ToString Then 

         Return True 

        Else 

         Return False 

        End If 
       Loop 
      End If 


     End Using 


     connection.Close() 
    End Using 

    Return False 

End Function 

Моя проблема Кажется, когда мой код попадает на строку «If Reader.HasRows Then». Еще раз спасибо, что посмотрели.

+0

Кстати, вам может понадобиться придерживаться паролей, например: [Solted Password Hashing - Doing it Right] (https://crackstation.net/hashing-security.htm). –

+0

Спасибо, я посмотрю на него – Codedin97

ответ

0

Это ваша проблема здесь:

Dim sSQL As String = "SELECT UserName, Password FROM [Table] WHERE UserName = 'Me.UserName.Text' AND Password = 'Me.Password.Text'" 

Вы хотите сказать, базу данных для сравнения значений в базе данных буквального текста «Me.UserName.Text» и «Me.Password.Text». Нигде вы не получаете текст, введенный пользователем, и отправляете его в базу данных. Обратите внимание, что в коде, который вы опубликовали, эти части красные? Это означает, что они являются частью литерала String. Если бы вы использовали переменные, они бы не были красными. Это то, что вы на самом деле имел в виду сделать:

Dim sSQL As String = "SELECT UserName, Password FROM [Table] WHERE UserName = '" & Me.UserName.Text & "' AND Password = '" & Me.Password.Text & "'" 

Что теперь с помощью переменных и получать данные из них и конкатенации, что данные в буквальном String.

Это все еще не очень хороший код. Я не буду вдаваться в это здесь, потому что это выходит за рамки вашего первоначального вопроса, но вы должны научиться использовать параметризованные запросы, которые защищают вас от различных проблем и, самое главное, SQL-инъекций.

+0

Хотя ответы в основном одинаковы, почему показывают неправильный способ сделать это вместо правильного пути? –

+0

А как я понимаю, я немедленно исправлю это и дам вам знать, работает ли оно. – Codedin97

+1

@ ZoharPeled, потому что я ответил на вопрос, как задал вопрос, почему код, как было написано, не работает. Возможно, это школьное задание, для которого использование параметризованного запроса было бы излишним и, возможно, считалось бы неправильным, поскольку оно использовало материал, который еще не преподавался. – jmcilhinney

2

Во-первых, Ваш SQL отправляется в базу данных, как это:

SELECT UserName, Password 
FROM [Table] 
WHERE UserName = 'Me.UserName.Text' AND Password = 'Me.Password.Text' 

Поскольку Предполагаю пользователь не выберет Me.UserName.Text в качестве имени пользователя и Me.Password.Text в качестве пароля, я думаю, никто не будет когда-нибудь пройти этот логин ,

Во-вторых, если вы думаете об исправлении этого путем конкатенации текстовых полей текста в строку sql, подумайте еще раз. Это серьезная опасность для безопасности. Читайте о Sql инъекциях.

Правильный способ - использовать параметризованные запросы или хранимые процедуры.

Dim sSQL As String = "SELECT 1 " & _ 
        "FROM [Table] " & _ 
        "WHERE UserName = @UserName " & _ 
        "AND Password = @PassWord " & _ 
        "AND @UserName = @Compare" 
    Using Command As New SqlCommand(sSQL, connection) 
     Command.Parameters.Add("@UserName", SqlDbType.VarChar).Value = Me.UserName.Text 
     Command.Parameters.Add("@Password", SqlDbType.VarChar).Value = Me.Password.Text 
     Command.Parameters.Add("@Compare", SqlDbType.VarChar).Value = Compare1 
     Dim Reader As SqlDataReader = Command.ExecuteReader() 
     Return Reader.HasRows 
    End Using 

Обратите внимание, что, когда положение уже сравнивал значения для вас, так что все, что вам нужно сделать, это просто увидеть, если какие-либо строки, возвращенные запросом.

+0

Спасибо за то, что привлек это к моему вниманию, я прочитаю об этом, чтобы я мог полностью понять, что вы сделали, а также за то, что я выяснил свою проблему с моим запросом – Codedin97

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