【问题标题】:Error on Search Button搜索按钮错误
【发布时间】:2020-07-06 16:55:05
【问题描述】:

我搜索了一些关于如何在 VB.net 中执行搜索按钮的代码。但不知何故,由于错误,它不会工作。仅仅因为,我无法理解它的算法和功能。新手来了无论如何,这里是搜索按钮的代码:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    myConnection.Open()
    crd.Clear()
    fn.Clear()
    ln.Clear()
    Dim str As String
    str = "SELECT * FROM tblReg WHERE (Code = '" & src.Text & "')"
    Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
    dr = cmd.ExecuteReader
    While dr.Read()
        crd.Text = dr("crd").ToString
        fn.Text = dr("fName").ToString
        ln.Text = dr("lName").ToString
    End While
    myConnection.Close()
End Sub

错误出现了:

dr = cmd.ExecuteReader

而VB说:

System.Data.dll 中出现“System.Data.OleDb.OleDbException”类型的未处理异常

附加信息:没有为一个或多个必需参数指定值。

【问题讨论】:

  • @DanielShillcock OP 已经在值周围加上了单引号。
  • @GSerg 如果src.Text 包含撇号? ;-) OP 应该使用参数化查询。
  • 比撇号更糟糕的是'; Drop Table tblReg;
  • @DanielShillcock 那么这将是一个无效的SQL表达式错误,除非src.Textalso contains --,但是这样就完全没有错误了。他们应该使用parameterized queries,只是那个特定的问题不是相关的。

标签: vb.net ms-access


【解决方案1】:

不应遵循教授非常糟糕的代码的在线教程。 That code 非常糟糕,因为它包含 SQL injection 并让数据库对象处于打开状态。

你应该重写你的代码如下:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    myConnection.Open()
    crd.Clear()
    fn.Clear()
    ln.Clear()

    Using cmd = New OleDbCommand("SELECT * FROM tblReg WHERE Code = ?", myConnection)
        cmd.CommandType = CommandType.Text

        With cmd.Parameters.Add(Nothing, OleDbType.VarChar, 50)
            .Direction = ParameterDirection.Input
            .Value = src.Text
        End With

        Using dr = cmd.ExecuteReader()
            While dr.Read()
                crd.Text = dr("crd").ToString
                fn.Text = dr("fName").ToString
                ln.Text = dr("lName").ToString
            End While
        End Using
    End Using

    myConnection.Close()
End Sub

您必须使用问号代替参数,因为您使用的是OleDbCommand 和does not support named parameters。

将OleDbType.VarChar 更改为您的实际列类型。

【讨论】:

  • 我会试试那个。太感谢了。 :>
  • 我仍然在 dr = cmd.ExecuteReader() 上收到错误,而且当我更换 OleDbType.Varchar 时,它不会接受它。
  • 你确定错误在cmd.ExecuteReader,你用什么替换它?
【解决方案2】:

这是获取代码的链接吗?

http://www.visual-basic-tutorials.com/ReadFromAccess.htm

请不要让代码读取输出显示的每个数据,并检查这部分代码。

 crd.Text = dr("crd").ToString
        fn.Text = dr("fName").ToString
        ln.Text = dr("lName").ToString

您确定crd,fname,lname 是您表中字段的名称吗?请检查一下,code? 的字段类型是什么,它是自动增量的文本还是 INT?还是只是一个INT?不管是什么改变你的代码。

来自

str = "SELECT * FROM tblReg WHERE (Code = '" & src.Text & "')"

到

str = "SELECT * FROM tblReg WHERE Code =" & src.Text

更新

我建议您根据获取代码的链接更好地阅读或遵循整个说明。我建议按照链接所说的创建相同的内容,当程序运行时没有错误,然后将其与您的程序合并,因为我使用 VB.NET 和 Access 进行了尝试,它确实有效,我确定您没有阅读它。这样做,我相信您不仅会获得所需的代码,而且还会学习。

【讨论】:

  • 是的。它们是我的领域的名称。我对它们进行了三次检查。什么code?哈哈哈。 :> 谢谢。 :D
  • "SELECT * FROM tblReg WHERE Code =" & src.Text 用这个替换你的代码
  • 哦。好的。我还有一个问题,tblReg 是我的表的名称。我要换还是不换?因为我需要从 crd 的字段中获取信息。
  • 您将获得这些数据的表的名称是什么?
  • 我觉得没什么好笑的?我也和你一样Pinoy,所以你的意思是你点击一张卡片,点击卡片后,数字显示在文本框中?对
猜你喜欢
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 2019-01-01
相关资源
最近更新 更多