#vb.net
#vb.net
Вопрос:
У меня есть три таблицы в базе данных access и приложение в vb.net где я пытаюсь выполнить поиск данных из всех трех таблиц по текстовому полю, но это выдает ошибку. может кто-нибудь сказать мне, как это сделать?
enter code here
Частная проверка ()
Dim Myconn As New OleDbConnection(constr)
Dim adapter As New OleDbDataAdapter()
Dim command As New OleDbCommand()
Dim sql = "select descriptionofgoods,remarks,mode from tabel1 INNER JOIN table2 ON tabel1.id = tabel2.id inner join tabel3 on tabel1.id = tabel3.id;"
Try
Myconn.Open()
dt.Clear()
If TextBox2.Text > "" Then
sql = sql amp; " and [id] = ? "
command.Parameters.AddWithValue("id", TextBox1.Text)
End If
command.Connection = Myconn
command.CommandText = sql
adapter.SelectCommand = command
adapter.Fill(dt)
If dt.Rows.Count > 0 Then
DataGridView1.DataSource = dt
DataGridView1.Refresh()
Else
MessageBox.Show("ITEM NOT FOUND")
End If
Catch exp As Exception
Throw exp
Finally
If Myconn IsNot Nothing Then Myconn.Close()
End Try
End Sub
Комментарии:
1. Ваша строка sql заканчивается точкой с запятой, поэтому вы не можете просто объединить с ней дополнительную строку. Но вам не нужно «и», вам нужно предложение Where.
2. Также у вас есть ‘table2’ и ‘tabel2’ в вашем соединении
3. И какую именно ошибку это выдает, где возникает ошибка? Вы прошли через свой код, проверяя состояние в каждой точке, чтобы убедиться, что оно соответствует ожиданиям?
Ответ №1:
Большая часть вашего кода избыточна и может быть удалена:
Using da as New OleDbDataAdapter("select descriptionofgoods,remarks,mode from tabel1 INNER JOIN table2 ON tabel1.id = tabel2.id inner join tabel3 on tabel1.id = tabel3.id", constr)
Dim dt = DirectCast(DataGridView1.DataSource, DataTable)
dt.BeginLoadData()
dt.Clear()
If Not string.IsNullOrEmpty(TextBox2.Text) Then
da.SelectCommand.CommandText amp;= " and tabel1.[id] = ? "
da.SelectCommand.Parameters.AddWithValue("id", TextBox1.Text) 'why is this TextBox1 when you tested textbox2 in the If?
End If
adapter.Fill(dt)
dt.EndLoadData()
End Using
Примечания:
- Используйте Using; тогда вам не нужна ваша попытка / Finally
- DataAdapter знает, как создать и открыть соединение самостоятельно
- Не перехватывайте исключения только для того, чтобы снова их выбросить; это нарушает трассировку стека. Не ставьте catch вообще, если вы не собираетесь ничего перехватывать;
Try ... Finally
это законно,Throw
само по себе является законным (не нарушает трассировку стека) - Не завершайте SQL точкой с запятой, если вы хотите добавить к нему. В любом случае не завершайте ни одного оператора SQL точкой с запятой
- У вас есть несколько таблиц со столбцом ID; Access может позволить вам не указывать, о каком идентификаторе вы говорите, но надлежащие базы данных не будут, поэтому теперь у вас войдет в привычку полностью уточнять каждый столбец (в вашем выборе тоже)
- Смотрите комментарий о TextBox1 / TextBox2
- Пожалуйста .. назовите свои элементы управления правильно. «имя типа объекта плюс серийный номер» ни для чего не подходит; ваше имя Панкадж Баббар, а не human105874274365. Вы правильно называете свои локальные переменные, но не переменные уровня класса, что определенно неверно
- Чтобы переименовать элемент управления после добавления его в форму Windows, щелкните по нему, затем измените текст в строке (Имя) таблицы свойств
- Сообщение datatable о том, что вы собираетесь / завершили загрузку данных, повышает производительность
- Связанные элементы управления обновляются автоматически (если вы когда-либо используете BindingSource, также проверьте параметр RaiseListChangedEvents)
Комментарии:
1. Просто остерегайтесь использования параметров. AddWithValue(), вы, скорее всего, получите неожиданные и недопустимые приведения типов, и в некоторых ситуациях вам это может сойти с рук, есть много проблем, которые это вызовет
2. Caius Jard, это не работает. da.SelectCommand amp;= » и GIVE_A_TABLE_NAME_HERE. [id] = ? » это задающий оператор и не определен для команды oledb и строки. .
3. Блог @Hursey Joel посвящен SQL Server. Это не SQL Server. AddWithValue не является универсальным злом; пожалуйста, смотрите mysqlconnector.net/overview/using-addwithvalue
4. @pankajbabbar Я изменил код. ps, в вашем коде не должно быть указано
GIVE_A_TABLE_NAME_HERE
, потому что вы должны были заменить эту строку именем таблицы. Пожалуйста, убедитесь, что вы всегда читаете и понимаете то, что люди публикуют для вас в StackOverflow, не просто слепо копируете SO и вставляете в свой код . Я исправил это для вас, потому что все идентификаторы одинаковы, но вы все равно должны прочитать комментарий к строке под5. Сэр, имя моей таблицы tabel1, и я уже изменил имя таблицы на da. SelectCommand amp;= «tabel1.[id] = ? » Но это выдает ошибку, выдающую оператор amp; не определено для команды oledb и строки.