【问题标题】:Command text was not set for the command object using vb and ms-access未使用 vb 和 ms-access 为命令对象设置命令文本
【发布时间】:2021-04-24 03:21:54
【问题描述】:

问题: - 如果用户输入现有数据(姓名、员工 ID、电话号码、用户名和密码),则显示一条消息以进行验证。

这些是代码

我的数据库可以正常工作,但 msgbox 显示命令文本 wat not set for the command object

pro = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\SEM 5\CSC301\ASSESSMENT 3\database.accdb"
    connstring = pro
    myconnection.ConnectionString = connstring
    myconnection.Open()


    Dim con As New OleDbConnection
    con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\SEM 5\CSC301\ASSESSMENT 3\database.accdb"
    con.Open()

    Dim registercmd As OleDbCommand = New OleDbCommand("select * from users where [Librarian Name]='" & txtName.Text & "' or [Staff ID]='" &
                                                       txtStaffID.Text & "' or [Phone Number]='" & txtPhone.Text & "' or [Username]='" &
                                                       txtUsername.Text & "' or [Password]='" & txtPassword.Text & "'", con)
    Dim registerrd As OleDbDataReader = registercmd.ExecuteReader
    If (registerrd.Read() = True) Then
        Me.Hide()
        MessageBox.Show("Account Exist!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Me.Hide()
        Me.Show()
        txtName.Clear()
        txtStaffID.Clear()
        txtPhone.Clear()
        txtUsername.Clear()
        txtPassword.Clear()
    Else
        command = "insert into users([Librarian Name],[Staff ID],[Phone Number],[Username],[Password]) 
               Values('" & txtName.Text & "','" & txtStaffID.Text & "','" & txtPhone.Text & "','" & txtUsername.Text & "','" & txtPassword.Text & "')"

        Dim cmd As OleDbCommand = New OleDbCommand(command, myconnection)
        cmd.Parameters.Add(New OleDbParameter("ID", CType(txtName.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Librarian Name", CType(txtStaffID.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Staff ID", CType(txtPhone.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Phone Number", CType(txtUsername.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Username", CType(txtPassword.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Password", CType(txtPassword.Text, String)))
        MsgBox("Account Created")

        Me.Hide()
        Login.ShowDialog()
    End If

    Try
        cmd.ExecuteNonQuery()
        cmd.Dispose()
        myconnection.Close()
        txtName.Clear()
        txtStaffID.Clear()
        txtPhone.Clear()
        txtUsername.Clear()
        txtPassword.Clear()

    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

【问题讨论】:

  • 尽管您的代码存在许多问题,并且确实可以进行相当大的整理,但也不确定为什么,您是否调试/单步执行您的程序以确保 cmd 对象是当您尝试执行查询时,正如预期的那样?
  • If (registerrd.Read() = True)?你的意思是If registerrd.HasRows Then ...。 -- 也使用参数构建该查询。 -- 这没用:CType(txtStaffID.Text, StringText 已经是字符串了。 [ID] [Staff ID] 是字符串还是数值? -- 在第二个命令中,您添加的参数与查询的不匹配。查看ID 的设置。此外,您正在连接字符串而不是使用参数。
  • 这真是一团糟。您可以在 SO 中找到大量与查询数据库相关的帖子。

标签: vb.net ms-access


【解决方案1】:

您的代码以几个未声明的变量开始。连接字符串变量可以是类级别的变量,因此可以在多种方法中使用。然后,您打开一个直到代码执行到一半才使用的连接。不要直接在.Execute... 之前打开连接。我在 Stack Overflow 上读到了一个很好的类比。连接就像冰箱门。仅在必要时打开。尽快拿出或放入您需要的东西。然后尽快关闭。您可以将连接字符串直接传递给连接的构造函数。

需要释放数据库对象。即使有错误,Using...End Using 块也会为我们处理这个问题。我不得不猜测参数的数据类型。请检查您的数据库的类型是否正确并相应地更正代码。

Private ConStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\SEM 5\CSC301\ASSESSMENT 3\database.accdb"

Private Sub OpCode()
    Dim exists As Boolean
    Using con As New OleDbConnection(ConStr),
            registercmd As OleDbCommand = New OleDbCommand("select * from users where 
                                                            [Librarian Name]= @Name or 
                                                            [Staff ID]= @StaffID or 
                                                            [Phone Number]= @Phone or 
                                                            [Username]= @User or 
                                                            [Password]= @PWord;", con)
        With registercmd.Parameters
            .Add("@Name", OleDbType.VarWChar).Value = txtName.Text
            .Add("@StaffID", OleDbType.VarWChar).Value = txtStaffID.Text 'Often an ID is a numeric type. Check your database.
            .Add("@Phone", OleDbType.VarChar).Value = txtPhone.Text
            .Add("@User", OleDbType.VarWChar).Value = txtUsername.Text
            .Add("@PWord", OleDbType.VarWChar).Value = txtPassword.Text
        End With
        con.Open()
        Using registered = registercmd.ExecuteReader
            If registered.HasRows Then
                exists = True
            End If
        End Using
    End Using
    If exists Then
        MessageBox.Show("Account Exist!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Else
        Using con As New OleDbConnection(ConStr),
            cmd As OleDbCommand = New OleDbCommand("insert into users([Librarian Name],[Staff ID],[Phone Number],[Username],[Password]) 
           Values(@Name, @StaffID, @Phone, @UserName, @PWord);", con)
            With cmd.Parameters
                .Add("@Name", OleDbType.VarWChar).Value = txtName.Text
                .Add("@StaffID", OleDbType.VarWChar).Value = txtStaffID.Text
                .Add("@Phone", OleDbType.VarChar).Value = txtPhone.Text
                .Add("@UserName", OleDbType.VarWChar).Value = txtUsername.Text
                .Add("@PWord", OleDbType.VarWChar).Value = txtPassword.Text
            End With
            con.Open()
            cmd.ExecuteNonQuery()
        End Using
        MsgBox("Account Created")
        Hide()
        Login.ShowDialog()
    End If
    txtName.Clear()
    txtStaffID.Clear()
    txtPhone.Clear()
    txtUsername.Clear()
    txtPassword.Clear()
End Sub

我看到的另一个坏问题。您似乎将密码存储为纯文本。所有密码都应该加盐和加密。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2018-01-17
    • 2015-07-29
    • 2011-04-02
    • 2016-08-25
    相关资源
    最近更新 更多