Vb.net 查询表达式“Prod\u Num=”中出现语法错误(缺少运算符)

Vb.net 查询表达式“Prod\u Num=”中出现语法错误(缺少运算符),vb.net,Vb.net,此语法错误在查询表达式“Prod_Num=”中缺少运算符。当我试图搜索数据库中的项目时,总是显示。请帮帮我 导入系统 导入系统数据 导入System.Data.OleDb 公开课表格1 Dim con As New OleDb.OleDbConnection Dim cmd As OleDbCommand Dim da As OleDb.OleDbDataAdapter Dim ds As New DataSet Dim dt As New DataTable Dim sql As String

此语法错误在查询表达式“Prod_Num=”中缺少运算符。当我试图搜索数据库中的项目时,总是显示。请帮帮我

导入系统 导入系统数据 导入System.Data.OleDb

公开课表格1

Dim con As New OleDb.OleDbConnection
Dim cmd As OleDbCommand
Dim da As OleDb.OleDbDataAdapter
Dim ds As New DataSet
Dim dt As New DataTable
Dim sql As String
Dim dbp As String
Dim dbs As String

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    dbp = "Provider = Microsoft.ACE.OLEDB.12.0;"
    dbs = "Data Source=" & Application.StartupPath & "/POS.accdb"
    con.ConnectionString = dbp & dbs
    con.ConnectionString = dbp & dbs
    con.Open()
    sql = "SELECT * FROM tblInventory"
    da = New OleDb.OleDbDataAdapter(sql, con)
    da.Fill(dt)
    dgList.DataSource = dt
    txtPNum.Focus()
End Sub

Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click
    dt.Clear()
    txtPNum.Text = ""
    sql = "SELECT * FROM tblInventory WHERE Prod_Num =" & txtPNum.Text
    da = New OleDb.OleDbDataAdapter(sql, con)
    da.Fill(dt)
    dgList.DataSource = dt
    txtPName = dt.Rows(0).Item(1)
    txtNOrder = dt.Rows(0).Item(2)
    txtPRem = dt.Rows(0).Item(3)
    txtPrice = dt.Rows(0).Item(4)
    txtPNum.Focus()
End Sub

Text是否包含任何数据

为什么不尝试检查它,因为如果它是空的,则运行的SQL语句是SELECT*FROM tblInventory WHERE Prod_Num=这将引发该错误


另外,如果Prod_Num列是整数,可能您应该使用inttxtPNum.Text如果该值是字符串,这也会阻止SQL注入。

我猜您在这里遇到了问题:

Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click
    dt.Clear()
    txtPNum.Text = ""   ' <-----------------
    sql = "SELECT * FROM tblInventory WHERE Prod_Num =" & txtPNum.Text
    da = New OleDb.OleDbDataAdapter(sql, con)
    da.Fill(dt)
    dgList.DataSource = dt
    txtPName = dt.Rows(0).Item(1)
    txtNOrder = dt.Rows(0).Item(2)
    txtPRem = dt.Rows(0).Item(3)
    txtPrice = dt.Rows(0).Item(4)
    txtPNum.Focus()
End Sub
因为您总是在将文本框传递给查询之前清除它的文本

注:

不要忘记通过参数化查询实现它。这不是一个好办法

请参见参数化查询示例:


希望有帮助

除了其他人指出的txtPNum.Text的问题之外,我还推荐一些其他东西:

使用参数化查询避免SQL注入。 在连接中使用Using blocks,完成后立即关闭连接。例如,在Form_Load中,打开连接并保持其打开状态。这不是好的做法。 例如:

Imports System 
Imports System.Data 
Imports System.Data.OleDb

Public Class Form1

    Dim con As OleDbConnection
    Dim cmd As OleDbCommand
    Dim da As OleDbDataAdapter
    Dim ds As New DataSet
    Dim dt As New DataTable
    Dim dbp As String
    Dim dbs As String

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        dbp = "Provider = Microsoft.ACE.OLEDB.12.0;"
        dbs = "Data Source=" & Application.StartupPath & "/POS.accdb"

        Using con As OleDbConnection = New OleDbConnection(dbp & dbs)

            con.Open()

            da = New OleDbDataAdapter("SELECT * FROM tblInventory", con)
            da.Fill(dt)

            dgList.DataSource = dt
        End Using

        txtPNum.Focus()
    End Sub

    Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click

        dt.Clear()

        Using con As OleDbConnection = New OleDbConnection(dbp & dbs)

            con.Open()

            da = New OleDbDataAdapter("SELECT * FROM tblInventory WHERE Prod_Num = @ProdNum", con)
            da.SelectCommand.Parameters.AddWithValue("@ProdNum", txtPNum.Text)
            da.Fill(dt)

            dgList.DataSource = dt         
        End Using

        txtPName = dt.Rows(0).Item(1)
        txtNOrder = dt.Rows(0).Item(2)
        txtPRem = dt.Rows(0).Item(3)
        txtPrice = dt.Rows(0).Item(4)
        txtPNum.Focus()
    End Sub

我还建议添加一些Try-Catch块来处理错误,如果文本框不是字符串,您可能需要转换分配给文本框的值。

它如何包含数据。。。您正在执行此操作的SQL语句正上方:-txtPNum.Text=txtPNum.Text是否返回空值?请搜索参数化查询。您应该将值存储在变量中,SQL语句将更改为ProdNum=&yourvariable&或只需执行WHERE ProdNum='&txtPNum.Text&'SQL注入警报。这个代码只是乞求被黑客攻击。
Imports System 
Imports System.Data 
Imports System.Data.OleDb

Public Class Form1

    Dim con As OleDbConnection
    Dim cmd As OleDbCommand
    Dim da As OleDbDataAdapter
    Dim ds As New DataSet
    Dim dt As New DataTable
    Dim dbp As String
    Dim dbs As String

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        dbp = "Provider = Microsoft.ACE.OLEDB.12.0;"
        dbs = "Data Source=" & Application.StartupPath & "/POS.accdb"

        Using con As OleDbConnection = New OleDbConnection(dbp & dbs)

            con.Open()

            da = New OleDbDataAdapter("SELECT * FROM tblInventory", con)
            da.Fill(dt)

            dgList.DataSource = dt
        End Using

        txtPNum.Focus()
    End Sub

    Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click

        dt.Clear()

        Using con As OleDbConnection = New OleDbConnection(dbp & dbs)

            con.Open()

            da = New OleDbDataAdapter("SELECT * FROM tblInventory WHERE Prod_Num = @ProdNum", con)
            da.SelectCommand.Parameters.AddWithValue("@ProdNum", txtPNum.Text)
            da.Fill(dt)

            dgList.DataSource = dt         
        End Using

        txtPName = dt.Rows(0).Item(1)
        txtNOrder = dt.Rows(0).Item(2)
        txtPRem = dt.Rows(0).Item(3)
        txtPrice = dt.Rows(0).Item(4)
        txtPNum.Focus()
    End Sub