查询表达式'Prod_Num ='中的语法错误(缺少运算符)

时间:2013-08-15 04:26:38

标签: vb.net

查询表达式'Prod_Num ='中的此语法错误(缺少运算符)。当我试图搜索数据库中的项目时总是出现。请帮我。

进口系统 导入System.Data Imports System.Data.OleDb

Public Class Form1

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

3 个答案:

答案 0 :(得分:1)

我的猜测是你有问题:

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 = ""

由于您在将txtPNum文本框的文本传递给查询之前始终会清除它。

注意:

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

参见参数化查询示例:

Example 1

Example 2

希望它有所帮助!

答案 1 :(得分:0)

txtPNum.Text包含任何数据吗?

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

此外,如果Prod_Num列是整数,也许你应该使用int(txtPNum.Text),如果该值是一个字符串,这也会阻止SQL注入。

答案 2 :(得分:0)

除了其他人指出的txtPNum.Text问题外,我还会推荐其他一些事项:

  1. 使用参数化查询来避免SQL注入。
  2. 在您的连接中使用Using块,并在完成后立即关闭连接。例如,在Form_Load中,打开连接并将其保持打开状态。这不是好习惯。
  3. 示例:

    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块来处理错误,如果它们不是String,你可能需要转换你分配给文本框的值。