ODBC select语句获取布尔值

时间:2011-05-14 22:31:44

标签: mysql vb.net ado.net odbc

我正在尝试检查我的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 个答案:

答案 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”。

希望这有帮助,