Необходимо извлечь дополнительные значения на основе ключа имени в таблице из БД в VB.NET - PullRequest
0 голосов
/ 17 апреля 2020

Итак, сначала я извлек все значения с идентификатором имени из таблицы, которую я имею, и поместил их в поле со списком. Данные, загруженные в таблицу:

EstablishConnection("SELECT Name FROM Publishers")

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

SELECT        PubID, [Company Name], Address, City, State, Zip, Telephone, Fax
FROM          Publishers
WHERE         Name=''

И в VB реализовал его с помощью выбранное значение в выпадающем списке

EstablishConnection(String.Format("SELECT PubID, [Company Name], Address, City, State, Zip, Telephone, Fax FROM Publishers WHERE Name='{0}'", oleDbCmbNames.SelectedItem.ToString()))

Но он возвращает только одно значение, а не все, и говорит, что БД отсутствует, основываясь на исключении, которое я ему дал.

Public Class Form1
    Private Sub PublishersBindingNavigatorSaveItem_Click(sender As Object, e As EventArgs)
        Me.Validate()
        Me.PublishersBindingSource.EndEdit()
        Me.TableAdapterManager.UpdateAll(Me.ContactsDataSet)

    End Sub


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'ContactsDataSet.Publishers' table. You can move, or remove it, as needed.
        Me.PublishersTableAdapter.Fill(Me.ContactsDataSet.Publishers)

        'TODO: This line of code loads data into the 'ContactsDataSet.Publishers' table. You can move, or remove it, as needed.
        Me.PublishersTableAdapter.Fill(Me.ContactsDataSet.Publishers)

        'Establish a connection to the DB and fill combobox with names
        EstablishConnection("SELECT Name FROM Publishers")

    End Sub

    ' Instantiate Connection
    Dim connection As OleDb.OleDbConnection

    ' This function prepares, establishs, inquires, and closes the connection to the DB
    Public Sub EstablishConnection(request As String)

        Try
            ' Initialize new connection
            connection = New OleDb.OleDbConnection

            ' Initialize SQL inquiry
            Dim command As New OleDb.OleDbCommand()

            ' Assign Inquiry request to command
            command = New OleDb.OleDbCommand(request, connection)

            ' Assign db source before establishing a connection
            connection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Contacts.mdb"

            ' Open connection
            connection.Open()

            ' Initialize DB reader with inquiry
            Dim oleDBReader As OleDb.OleDbDataReader = command.ExecuteReader

            If oleDbCmbNames.Items.Count = 0 Then
                ' Read db, return inquries
                While oleDBReader.Read
                    ' Add each inquiry name string to combobox
                    oleDbCmbNames.Items.Add(oleDBReader("Name").ToString)
                End While
            ElseIf oleDbCmbNames.Items.Count > 0 Then
                ' Read db, return inquries
                While oleDBReader.Read()
                    PubIDLabelTextResult.Text = oleDBReader.Item("PubID").ToString
                    Company_NameLabelTextResult.Text = oleDBReader.Item("[Company Name]").ToString
                    AddressLabelTextResult.Text = oleDBReader.Item("Address").ToString
                    CityLabelTextResult.Text = oleDBReader.Item("City").ToString
                    StateLabelTextResult.Text = oleDBReader.Item("State").ToString
                    ZipLabelTextResult.Text = oleDBReader.Item("Zip").ToString
                    TelephoneLabelTextResult.Text = oleDBReader.Item("Telephone").ToString
                    FaxLabelTextResult.Text = oleDBReader.Item("Fax").ToString
                End While
            End If

        Catch ex As Exception
            ' Return if db not found or cannot connect.
            MessageBox.Show("Could not connect to DB. Ensure DB is not missing.")
        Finally
            ' Close connection
            connection.Close()
        End Try



    End Sub

    Private Sub oleDbCmbNames_SelectedIndexChanged(sender As Object, e As EventArgs) Handles oleDbCmbNames.SelectedIndexChanged
        EstablishConnection(String.Format("SELECT PubID, [Company Name], Address, City, State, Zip, Telephone, Fax FROM Publishers WHERE Name='{0}'", oleDbCmbNames.SelectedItem.ToString().Trim))
    End Sub
End Class

1 Ответ

1 голос
/ 17 апреля 2020

Итак, для вопроса, который я задал в комментариях, я предполагаю, что вы хотите использовать поле со списком в качестве навигационного устройства. Вы меняете комбо и кучу других элементов управления в форме, изменяя их содержимое. Я предполагаю это из того, что похоже на то, что код пытается сделать. Если это не то, что вы пытаетесь сделать, дайте мне знать, и я сделаю исправленный ответ

Итак, у вас есть набор данных и табличный адаптер, который загружает всех ваших издателей. На самом деле, дважды - вы можете удалить одну из этих идентичных команд заполнения из обработчика события Load формы. Нет смысла делать два вызова одной и той же вещи сразу после друг друга

Далее, вам нужно выбросить весь этот код в EstablishConnection и каждый вызов этого. Совместное использование адаптеров данных и табличных адаптеров, особенно когда вы только начинаете, приведет к путанице. Адаптеры таблиц великолепны, они генерируют безопасные sql, которые могут иметь параметры и просты в использовании. То, что у вас есть здесь, в вашем сабе EstablishConnection, - очень небезопасный способ запуска SQL. Для чего, прочитайте http://bobby-tables.com, затем вернитесь и удалите этот код, так что у вас просто так 1008 *

Public Class Form1
    Private Sub PublishersBindingNavigatorSaveItem_Click(sender As Object, e As EventArgs)
        Me.Validate()
        Me.PublishersBindingSource.EndEdit()
        Me.TableAdapterManager.UpdateAll(Me.ContactsDataSet)
    End Sub


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.PublishersTableAdapter.Fill(Me.ContactsDataSet.Publishers)
    End Sub
End Class

Да, что весь код, который находится за вашим кодом формы, должен в данный момент содержать

Теперь, go для вашего дизайнера форм и удалить все комбинации, текстовые поля, метки и т. Д. c, которые относятся к издателю. Я знаю, это звучит так, будто я пытаюсь заставить вас отслеживать sh ваш проект, но это так, чтобы я мог прийти в согласованное состояние, когда мы находимся на одной странице, и я знаю, что в вашей форме и как она связана вверх.

После того, как вы очистили свою форму (вы можете оставить ContactsDataSet, PublisherTableAdapter и другие элементы внизу, а также любые элементы управления, не связанные с издателями), откройте меню Вид, go для других Windows и выберите Данные Источники. Он покажет панель инструментов, подобную этой (и это отличный пи c, потому что он также демонстрирует некоторые другие точки):

enter image description here ( credit )

Поскольку из приведенного выше кода мне кажется, что вы хотите загрузить данные своего издателя в метки, а не в текстовые поля, вы можете расширить свой набор данных контактов, развернуть узел издателей и изменить тип узлы под ним (адрес, почтовый индекс, телефон, факс и т. д. c) от текстового поля до метки. После того, как вы изменили их для метки, перетащите их по одному на форму. Либо измените узел заголовка с DatagridView на Подробности, а затем перетащите узел заголовка на форму, чтобы быстро создать метку для каждого элемента в узле заголовка

Теперь у вас есть набор меток, привязанных к данным ( подключен) к вашей таблице издателей контактов. Вы можете щелкнуть любой ярлык и посмотреть в строке (Привязки данных) сетки свойств и увидеть, что их свойство Text связано со столбцом таблицы издателей, а их источником данных является то, что называется publishersBindingSource. Источник привязки поддерживает концепцию «текущей записи» в списке из нескольких записей. У вас есть 100 издателей, вы устанавливаете текущую запись bindingsource на 50-е, все метки показывают данные для 50-го издателя. Вы указываете bindingsource перейти на 51-е издательство, и все ярлыки автоматически меняют свое содержание. Вы можете убедиться в этом в действии, запустив свой проект и щелкнув стрелки в bindingnavigator вверху формы. При вызове «Заполнить форму» загружаются 100 издателей (скажем, источник привязки начинает указывать на первого, нажимая кнопку «следующий / предыдущий / последний» или ввод числа), изменит текущую запись источника привязки, которая находится между списком 100 издатели в наборе данных и ваши элементы управления (которые могут отображать только один издатель одновременно)

Теперь мы добавляем комбо к форме, чтобы действовать в качестве навигатора:

  • добавить Комбо для вашей формы
  • в окне свойств установите его источник данных как PublishersBindingSource - это жизненно важно
  • введите слово Name в настройке DisplayMember - необходимо, чтобы комбо отображал правильные вещи
  • установите DropDownStyle равным DropDownList - необязательно, но редактируемая комбинация действительно сбивает с толку этот контекст

Запустите ваш проект

При такой настройке комбо отобразит список элементов, которые он находит в источнике привязки, а выбранный в данный момент будет управлять текущей записью источника привязки , Изменение выбранного элемента в комбо приведет к изменению всех меток, потому что комбо повлияло на текущую запись источника связывания. Комбо больше не нужно, чтобы он действовал как навигатор, и попытка связать что-то еще заставит его начать действовать как редактор данных в текущей записи, а не как навигатор всех записей

...