2013-08-15 3 views
0

Ошибка синтаксиса (отсутствующий оператор) в выражении запроса 'Prod_Num ='. всегда появляется, когда я пытаюсь выполнить поиск элемента в базе данных. Пожалуйста, помогите мне.Ошибка синтаксиса (отсутствующий оператор) в выражении запроса 'Prod_Num ='

Импорт Система Импорт System.Data Импорт 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 
+1

Пожалуйста, настройте параметры, заданные в Google. –

+0

, вы должны сохранить свое значение в переменной, а ваш оператор sql изменится на WHERE ProdNum = "& yourvariable &" "ИЛИ просто сделать, где ProdNum = '" & txtPNum.Text & "' –

+1

Предупреждение Sql Injection.Этот код просто просит получить взломан. –

ответ

0

делает txtPNum.Text содержат какие-либо данные?

Почему бы вам не попробовать проверить это, потому что, если он пуст, ваш оператор SQL - это «SELECT * FROM tblInventory WHERE Prod_Num =», который приведет к этой ошибке.

Также, если столбец Prod_Num является целым числом, возможно, вы должны использовать int (txtPNum.Text), если это значение является строкой, это также предотвратит внедрение SQL.

+0

yes txtPNum.Text содержит данные и является целым типом ... –

+1

как он может содержать данные ... прямо над оператором SQL, который вы делаете это: - txtPNum.Text = "" – Jimmy

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

Надеется, что это помогает!

0

В дополнение к проблеме с txtPNum.Text, что другие указали, я рекомендовал бы пару других вещей:

  1. Используйте параметризованные запросы, чтобы избежать SQL Injection.
  2. Используйте Using блоки с подключением и закройте соединение, как только вы закончите. Например, в вашей 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 поймать блоки обработки ошибок, и вы, возможно, потребуется преобразовать значения вы присваиваете в текстовые поля, если они что-то другое, чем Строка.

+0

спасибо ^^ Я попробовал это и это сработало!! большое спасибо ... –

+0

Добро пожаловать - счастливое кодирование :) – Tim

Смежные вопросы