ODBC оператор выбора, чтобы получить логическое значение - PullRequest
0 голосов
/ 15 мая 2011

Я пытаюсь проверить, есть ли имя пользователя и пароль в моей базе данных MySQL, и если да, мне нужно вернуть true, иначе false. Это то, что у меня есть:

myconn.Open()

Dim selectSQL As String = "SELECT * 
                             FROM member 
                            WHERE Username = " & objMember.Username & " 
                              AND Password= " & objMember.Password
Dim cmd As New OdbcCommand(selectSQL, myconn)

cmd.ExecuteNonQuery()

If cmd.Parameters.Count = 1 Then
    Return True
Else
    Return False
End If

myconn.Close()
myconn.Dispose()

Все, что я получаю, это 0, хотя имя пользователя и пароль существуют! Или, может быть, я не прав с моим кодированием?


РЕШЕНИЕ

myconn.Open()

Dim count As Integer = 0

Dim selectSQL As String = "SELECT COUNT(*)
                             FROM member 
                            WHERE Username = ? 
                              AND Password= ?"
Dim cmd As New OdbcCommand(selectSQL, myconn)

cmd.Parameters.AddWithValue("LidLoginnaam", objLid.LidLoginnaam)
cmd.Parameters.AddWithValue("LidWachtwoord", objLid.LidWachtwoord)

count = Convert.ToInt32(cmd.ExecuteScalar())

If count = 1 Then
    Return True
Else
    Return False
End If

myconn.Close()
myconn.Dispose()

Ответы [ 4 ]

3 голосов
/ 15 мая 2011

Не используйте конкатенацию строк для построения SQL-запросов, вместо этого используйте параметры.

http://msdn.microsoft.com/en-us/library/system.data.odbc.odbcparameter.aspx

Dim count as Integer = 0

Try
    Dim sql As String = "SELECT COUNT(*) FROM member WHERE Username = @username AND Password = @password"
    Dim cmd As New SqlCommand(sql, conn)
    cmd.Parameters.AddWithValue("@username", objMember.Username)
    cmd.Parameters.AddWithValue("@password", objMember.Password)
    count = Convert.ToInt32(cmd.ExecuteScalar())
Catch ex As Exception
    Console.WriteLine(ex.Message)
End Try

Return (count > 0)

Если вы не используете данные, полученные из запроса, просто используйте ExecuteScalar , чтобы получить количество записей, соответствующих вашему имени пользователя и паролю.

http://msdn.microsoft.com/en-us/library/system.data.odbc.odbccommand.executescalar.aspx

Это в основном возвращает TRUE, если count> 0 (имеется в виду запись, которая соответствует имени пользователя и паролю).

Также проверьте различие между различными методами выполнения команд здесь: http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand(v=vs.71).aspx. Вы используете ExecuteNonQuery для извлечения записей, которые являются неправильными для этой цели.

Надеюсь, это поможет.

2 голосов
/ 15 мая 2011

Я думаю, вы пропустили в запросе одинарную кавычку:

Dim selectSQL As String = "SELECT * 
                             FROM member 
                            WHERE Username = '" & objMember.Username & "' 
                              AND Password= '" & objMember.Password & "'"
2 голосов
/ 15 мая 2011

Игнорируя риски SQL-инъекций , строки в SQL должны быть в одинарных кавычках:

Dim selectSQL As String = "SELECT m.* 
                             FROM MEMBER m
                            WHERE m.username = '" & objMember.Username & "'
                              AND m.password = '" & objMember.Password & "' "

С точки зрения производительности, если вас не интересует содержимоетогда запрос не возвращает больше информации, чем вам нужно:

Dim selectSQL As String = "SELECT 1
                             FROM MEMBER m
                            WHERE m.username = '" & objMember.Username & "'
                              AND m.password = '" & objMember.Password & "' "

Запрос будет быстрее - если какой-либо из столбцов MEMBER является BLOB, вы можете некоторое время ждать.

1 голос
/ 15 мая 2011

Свойство Parameter OdbcCommand используется для доступа к коллекции параметров, которые будут использоваться при выполнении запроса ( дополнительная информация ).Это не поможет вам узнать, сколько строк содержится в наборе результатов запроса.

Если ваша единственная задача - определить, находится ли запрошенный участник в базе данных, измените начало запроса на SELECT COUNT(*) FROM.....Этот пересмотренный запрос вернет одно значение, указывающее, сколько записей соответствует критериям вашего запроса.

Выполните этот запрос, вызвав ExecuteScalar .Возвращаемое значение этого метода будет значением, возвращенным вышеупомянутым запросом - количество строк, соответствующих критериям вашего запроса.Если значение равно нулю, вы знаете, что в базе данных нет соответствующего члена.Используйте это значение вместо «cmd.Parameters.Count» в выражении «if».

Надеюсь, это поможет,
Ben

...