как выполнить внутреннее объединение двух или более таблиц из базы данных ms access с помощью vb.net ?

#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 и строки.