может ли кто-нибудь исправить мою ошибку, может ли кто-нибудь взглянуть на нее?

#mysql #vb.net #phpmyadmin #xampp

Вопрос:

поэтому я пытаюсь выполнить поиск записей в базе данных, но у меня ошибка

У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на наличие правильного синтаксиса для использования рядом с» ГДЕ имя продукта, НАПРИМЕР «Монитор «» % «» в строке 1

 Private Sub Btnsearch_Click(sender As Object, e As EventArgs) Handles btnsearch.Click  Try  ListView1.Items.Clear()  strsql = "SELECT tbl_pcperipherals WHERE ProductName LIKE @field1 '%'"  objcmd = New MySql.Data.MySqlClient.MySqlCommand(strsql, objconn)  With objcmd  .Parameters.AddWithValue("@field1", txtsearch.Text)  End With  objdr = objcmd.ExecuteReader  While (objdr.Read)  With ListView1.Items.Add(objdr("ProductID"))  .SubItems.add(objdr("ProductName"))  .subitems.add(objdr("ProductBrand"))  .subitems.add(objdr("ProductCategory"))  .subitems.add(objdr("ProductQuantity"))  .subitems.add(objdr("ProductDescription"))  .subitems.add(objdr("ProductManufacturer"))  .subitems.add(objdr("Stock"))  .subitems.add(objdr("Supplier"))  .subitems.add(objdr("ContactNo"))  End With  objcmd.Dispose()  objdr.Close()  End While  Catch ex As Exception  MsgBox(ex.Message)  Me.fillsview()  End Try End Sub  

Комментарии:

1. ВЫБЕРИТЕ tbl_pcperipherals, ГДЕ имя продукта, НАПРИМЕР @field1 , затем при добавлении параметров добавьте txtsearch. Текст «%»

2. И не удаляйте команду и не закрывайте считыватель, пока вы все еще находитесь в цикле

Ответ №1:

вы неправильно заполняете LIKE соответствующую строку .. попробуйте подать в суд

 "SELECT * from tbl_pcperipherals WHERE ProductName LIKE concat(@field1, '%')"  

Комментарии:

1. спасибо за ответ, но ошибка та же, у меня есть монитор записи на названии продукта, когда я выполняю поиск в текстовом поле и на мониторе ввода всплывающее окно с той же ошибкой.

2. ответ удален .. отсутствует в предложении .. .

Ответ №2:

Я не знаю, почему вы используете a ListView . У A DataGridView есть DataSource свойство, поэтому его легче кодировать.

Объявите ваши одноразовые объекты базы данных локально в Using блоке. В вашем операторе select отсутствует список полей и предложение From.

Ваш код закрывает считыватель после считывания первой записи, потому objdr.Close() что находится внутри While цикла. В любом случае, не стоит держать соединение открытым во время обновления пользовательского интерфейса. Соединения следует открывать в последнюю минуту и закрывать как можно скорее. A DataReader требуется открытое соединение. Если Load вы DataTable можете закрыть соединение, а затем заполнить представление списка.

 Private Sub Btnsearch_Click(sender As Object, e As EventArgs) Handles btnsearch.Click  Try  ListView1.Items.Clear()  Dim dt As New DataTable  Dim strsql = "SELECT * From tbl_pcperipherals WHERE ProductName LIKE @field1"  Using objconn As New MySqlConnection("Your connection string"),  objcmd As New MySqlCommand(strsql, objconn)  objcmd.Parameters.AddWithValue("@field1", txtsearch.Text amp; "%")  objconn.Open()  Using reader = objcmd.ExecuteReader  dt.Load(reader)  End Using 'closes and disposes reader  End Using 'disposes objcmd and closes and disposes objconn  For Each row As DataRow In dt.Rows  With ListView1.Items.Add(row("ProductID").ToString)  .SubItems.Add(row("ProductName").ToString)  .SubItems.Add(row("ProductBrand").ToString)  .SubItems.Add(row("ProductCategory").ToString)  .SubItems.Add(row("ProductQuantity").ToString)  .SubItems.Add(row("ProductDescription").ToString)  .SubItems.Add(row("ProductManufacturer").ToString)  .SubItems.Add(row("Stock").ToString)  .SubItems.Add(row("Supplier").ToString)  .SubItems.Add(row("ContactNo").ToString)  End With  Next  Catch ex As Exception  MsgBox(ex.Message)  End Try End Sub  

Комментарии:

1. спасибо, человек, я попробую эту процедуру в кнопке поиска, кстати, все мое соединение находится в моем модуле, поэтому «objconn Как новое соединение MySQL(«Ваша строка подключения»)» все в порядке, я удаляю это?

2. Соединения @NIX необходимо удалить, поэтому они должны быть объявлены в методе, в котором они используются в блоке Using. Удалите objconn из модуля. Возможно, вы захотите объявить строку подключения только в модуле.

Ответ №3:

Я верю, что если вы используете такой код, как этот, он решит вашу проблему:

 Dim strsql = string.format("SELECT tbl_pcperipherals WHERE ProductName LIKE '%{0}%'",txtsearch.Text);  

Ответ №4:

Привет, ребята, спасибо, что ответили на этот вопрос, я уже исправил его, немного изменил код и удалил уязвимость sql inject.

Это решит мою проблему

 SELECT * FROM tbl_pcperipherals WHERE ProductName LIKE @field1 '%'"  

Здесь изменение в моем коде и уязвимость sql inject удалены и заменены на это.

 Private Sub Btnsearch_Click(sender As Object, e As EventArgs) Handles btnsearch.Click  Try  ListView1.Items.Clear()  'Safe in SQL iNJECT'  objcmd = New MySql.Data.MySqlClient.MySqlCommand("SELECT * FROM tbl_pcperipherals WHERE ProductName LIKE @field1 '%'", objconn)  'Unsafe Vulnerable in SQL INJECT'  'strsql = "SELECT tbl_pcperipherals WHERE ProductName LIKE concat(@field1, '%')"'  'objcmd = New MySql.Data.MySqlClient.MySqlCommand(strsql, objconn)'   With objcmd  .Parameters.AddWithValue("@field1", txtsearch.Text)  End With  objdr = objcmd.ExecuteReader  While (objdr.Read)  With ListView1.Items.Add(objdr("ProductID"))  .SubItems.add(objdr("ProductName"))  .subitems.add(objdr("ProductBrand"))  .subitems.add(objdr("ProductCategory"))  .subitems.add(objdr("ProductQuantity"))  .subitems.add(objdr("ProductDescription"))  .subitems.add(objdr("ProductManufacturer"))  .subitems.add(objdr("Stock"))  .subitems.add(objdr("Supplier"))  .subitems.add(objdr("ContactNo"))  End With  End While  objcmd.Dispose()  objdr.Close()  Catch ex As Exception  MsgBox(ex.Message)  Me.fillsview()  End Try End Sub