我正在尝试检查我的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()
答案 0 :(得分:3)
不要使用字符串连接来构建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
如果count> gt,这基本上返回TRUE。 0(表示存在与用户名和密码匹配的记录)。
另请查看此处不同命令执行方法之间的区别:http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand(v=vs.71).aspx。您正在使用 ExecuteNonQuery 来检索不正确的记录。
希望这会有所帮助。
答案 1 :(得分:2)
忽略SQL Injection risks,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,您可能会等待一段时间。
答案 2 :(得分:2)
我认为你错过了查询中的单引号:
Dim selectSQL As String = "SELECT *
FROM member
WHERE Username = '" & objMember.Username & "'
AND Password= '" & objMember.Password & "'"
答案 3 :(得分:1)
OdbcCommand的Parameter属性用于访问执行查询时要使用的参数集合(more info)。它无法帮助您找出查询结果集中包含的行数。
如果您唯一关心的是确定所请求的成员是否在数据库中,请将查询的开头更改为SELECT COUNT(*) FROM....
。此修订后的查询将返回一个值,表示有多少记录符合您的查询条件。
通过调用ExecuteScalar执行此查询。此方法的返回值将是上述查询返回的值 - 与查询条件匹配的行数。如果值等于零,则表示数据库中不存在匹配成员。在“if”语句中使用此值代替“cmd.Parameters.Count”。
希望这有帮助,
本