#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