查询结果正确,但使用执行标量函数系统时返回0

时间:2019-02-11 06:39:11

标签: sql-server vb.net

ConnectString.connectStr()
con.Open()
Try
    cmd.Connection = con
    cmd.CommandText = ("select COUNT(userid) from login where userid='" & UserNametxt.Text & "'")
    Dim userName As Integer = Convert.ToInt32(cmd.ExecuteScalar())
    If userName <> 0 Then
        cmd.CommandText = ("select COUNT(password) from login where userid='" & passwordtxt.Text & "'")
        Dim password As Integer = Convert.ToInt32(cmd.ExecuteScalar())
        If password <> 0 Then
            UserMenu.Show()
        Else
            MsgBox("Password is wrong")
        End If
    Else

2 个答案:

答案 0 :(得分:0)

普通查询和函数的查询结果在您的情况下不会有所不同。但是您的功能应该有问题。 请更正下面的代码。

CREATE FUNCTION test_example (@userid BIGINT)
RETURNS BIGINT
BEGIN
    RETURN (select COUNT(userid) from login where userid = @userid)
END

答案 1 :(得分:0)

保持本地连接,直到最后一分钟才打开。

使用代码块可确保即使有错误也将关闭并处置数据库对象。

在调用数据库时始终使用参数。否则,您将面临SQL注入的风险。另外,它还可以防止错误传递数据并加快查询速度。

为什么两次命中数据库?只需在一个查询中使用Where子句中的And来提问。如果用户名或密码不正确,则不要让用户知道。请记住,您正在尝试防止未经授权的访问。只需说登录失败即可。

我将CountUser的声明移到了Using块上方,以便可以在Using块下看到它。打开连接时,我们不想显示MessageBox。没有告诉用户何时响应消息,连接将处于打开等待状态。

在真实的应用程序中,您永远不会将密码存储为纯文本。

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim CountUser As Integer
    'Pass the connection string directly to the constructor of the connection.
    Using cn As New SqlConnection("Your connection string")
        'Pass the command text and the connection directly to the constructor of the command
        Using cmd As New SqlCommand("select COUNT(userid) from login where userid = @UserID And password = @password;", cn)
            'I am guessing on the SqlDbType. Check the database for the actual type.
            cmd.Parameters.Add("@UserID", SqlDbType.VarChar).Value = UserNametxt.Text
            cmd.Parameters.Add("@password", SqlDbType.VarChar).Value = passwordtxt.Text
            cn.Open()
            CountUser = Convert.ToInt32(cmd.ExecuteScalar())
        End Using
    End Using
    If CountUser <> 1 Then
        MessageBox.Show("Login Failed")
    Else
        'Send them into the progam
    End If
End Sub