ExecuteScalar.Connection 属性尚未初始化


Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
If txtUsername.Text = Nothing Or txtPassword.Text = Nothing Then
MsgBox("Enter Credential", MsgBoxStyle.Exclamation)
End If
If connection.State = ConnectionState.Closed Then
connection.Open()
End If
Dim cmd As New OleDbCommand("select count (*) from Admin where username = ? and password = ?, connection")
cmd.Parameters.AddWithValue("@1", OleDbType.VarChar).Value = txtPassword.Text
cmd.Parameters.AddWithValue("@2", OleDbType.VarChar).Value = txtUsername.Text
Dim count = Convert.ToInt32(cmd.ExecuteScalar())
If (count > 0) Then
MsgBox("Login Succeed", MsgBoxStyle.Information)
Else
MsgBox("Account not found check credentials", MsgBoxStyle.Critical)
End If
End Sub
End Class

任何人都可以帮助我完成此代码... 这是用于登录表单

如果验证失败,您将需要退出 Sub。Return语句实现了这一目的。

您需要在 Using 块之外声明计数。您将在评估计数后显示消息框,并且我们不希望在用户响应消息框时连接挂起打开状态,因此我们在 Using 块之外进行评估。

将数据库对象保留在本地,以便可以控制何时关闭和释放它们。 即使存在错误,Using...End Using块也会完成此操作。

按照@MathieuGuindon在他的评论中所说的那样更正您的OleDbCommand构造函数。

我很高兴看到使用参数,我犹豫要不要抱怨,但是.添加方法是首选。http://www.dbdelta.com/addwithvalue-is-evil/和 https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/另一个: https://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications 这是另一个 https://andrevdm.blogspot.com/2010/12/parameterised-queriesdont-use.html 实际上,您正在混淆这两种方法。第二个参数.AddWithValue需要值而不是OleDbType。它是 Object 类型,因此它不会产生编译错误,但会在到达数据库时爆炸。

在 .执行连接是宝贵的资源,因此您不希望将它们保持打开状态超过必要的时间。

最后,切勿将密码存储为纯文本。我将留给您研究密码保护的加盐和哈希。

Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
If String.IsNullOrWhiteSpace(txtUsername.Text) OrElse String.IsNullOrWhiteSpace) txtPassword.Text) Then
MsgBox("Enter Credential", MsgBoxStyle.Exclamation)
Return
End If
Dim count As Integer
Using connection As New OleDbConnection("Your connection string")
Using cmd As New OleDbCommand("select count (*) from Admin where username = ? and password = ?", connection)
cmd.Parameters.Add("@1", OleDbType.VarChar).Value = txtPassword.Text
cmd.Parameters.Add("@2", OleDbType.VarChar).Value = txtUsername.Text
connection.Open()
count = Convert.ToInt32(cmd.ExecuteScalar())
End Using
End Using 'Closes and Disposes the connection
If count > 0 Then
MessageBox.Show("Login Succeed", "Login", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
MessageBox.Show("Account not found check credentials", "Login", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
End Sub

最新更新