У меня вопрос о значениях базы данных и о том, как определить идентификатор значения, которое пользователь изменил в какой-то момент.Поиск в базе данных из списка ComboBox
Как и в настоящее время, имеется сборник, который заполняется из набора данных, и последующие текстовые поля, текст которых должен определяться значением, выбранным из этого списка.
Предположим, например, вы выбрали «Компонента A» из поля со списком, я бы хотел, чтобы вся заполняемая текстовая информация была заполнена соответствующей информацией из этой строки в базе данных (Name = Company A, Address = 123 ABC St., и т. д.)
Я могу заполнить поле со списком прекрасно. Это только, однако при изменении индекса ComboBox, что происходит эта конкретная ошибка:
Необработанное исключение типа «System.Data.OleDb.OleDbException» произошло в System.Data.dll
Дополнительная информация: несоответствие типа данных в выражении критериев.
Вот соответствующий код:
Imports System.Data.OleDb
Public Class CustomerContact
Dim cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|datadirectory|\CentralDatabase.accdb;")
Dim da As New OleDbDataAdapter()
Dim dt As New DataTable()
Private Sub CustomerContact_Load(sender As Object, e As EventArgs) Handles MyBase.Load
cn.Open()
da.SelectCommand = New OleDbCommand("select * from Customers", cn)
da.Fill(dt)
Dim r As DataRow
For Each r In dt.Rows
cboVendorName.Items.Add(r("Name").ToString)
cboVendorName.ValueMember = "ID"
Next
cn.Close()
End Sub
Private Sub cboVendorName_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboVendorName.SelectedIndexChanged
cn.Open()
da.SelectCommand = New OleDbCommand("select * from Customers WHERE id='" & cboVendorName.SelectedValue & "'", cn)
da.Fill(dt)
Dim r As DataRow
For Each r In dt.Rows
txtNewName.Text = "Name"
txtAddress.Text = "Address"
Next
cn.Close()
End Sub
Ошибка поймана на линии 24 настоящего Кодекса, на втором da.Fill (DT). Теперь, очевидно, из исключения я знаю, что я отправляю неправильный тип данных в OleDbCommand, к сожалению, я новичок, когда дело доходит до SQL-команд, таких как это. Также имейте в виду, что я не могу даже проверить второй цикл For, тот, который должен заполнить информацию Customer в текстовые поля (для удобства я копировал только первые два текстовых поля, из которых всего девять). Я думаю, что я мог бы использовать оператор If, чтобы определить, прочитана ли строка, и оттуда заполняют текстовые поля, но я буду прыгать с этим препятствием, когда смогу это достичь.
Любые рекомендации или предложения будут высоко оценены. Опять же, я новичок в управлении базой данных, и данный код относится к проекту, в котором моя нынешняя стажировка заставляет меня писать для них.
Используйте параметры, чтобы избежать SQL Injection , и исправить вашу ошибку. – LarsTech
Я бы предположил, что вам вообще не нужно запускать новый запрос. У этого DataTable уже есть все клиенты. – Plutonix
Спасибо, Плутоникс, я имею в виду, что я вижу, что вы говорите, как исходный DataTable уже заполнен информацией, но затем как определить, какая строка клиента заполняется, в зависимости от того, какой индекс выпадающего списка выбрал пользователь? Мой текущий процесс мышления, как вы видите, заключается в том, чтобы запускать новый запрос с идентификатором выбранного значения из выпадающего списка. – TGautier