> Система.ArgumentNullException: «аргумент столбца не может быть нулевым. Имя параметра: столбец» при попытке выполнить родительский дочерний выпадающий список с базой данных

#vb.net #sqlite

#vb.net #sqlite

Вопрос:

Я изо всех сил пытаюсь заставить работать некоторый код, который был показан мне в предыдущем вопросе. Я совсем новичок в vb.net и программирование баз данных, так что я не совсем понимаю, как заставить это работать. Код, который я пытаюсь выполнить, находится по этой ссылке https://www.vbforums.com/showthread.php?518065 . Мне нужен пользовательский ввод в родительское поле со списком, чтобы затем изменить данные в дочернем поле со списком. Вот что я получил до сих пор, если кто-нибудь может указать мне правильное направление, мне действительно нужно как-то заставить это работать

Редактировать: после изменения кода в соответствии с вашими комментариями я получаю это сообщение об ошибке :

Система.ArgumentNullException: «аргумент столбца не может быть нулевым. Имя параметра: столбец’

       Dim data As DataSet = Me.GetDataSet()


    Me.BindingSource1.DataSource = data
    Me.BindingSource1.DataMember = "RoomType"

    Me.BindingSource2.DataSource = Me.BindingSource1
    Me.BindingSource2.DataMember = "Rooms"

    Me.cmbRoomType.DisplayMember = "roomtype.RoomTypeName"
    Me.cmbRoomType.ValueMember = "roomtype.RoomTypeID"
    Me.cmbRoomType.DataSource = Me.BindingSource1

    Me.cmbRoomNumber.DisplayMember = "roomsRoomNumber"
    Me.cmbRoomNumber.ValueMember = "rooms.RoomID"
    Me.cmbRoomNumber.DataSource = Me.BindingSource2



End Sub
Private ConStr As String = "Data Source=dbNEAProject.db"

Private Function GetDataSet() As DataSet
    Dim data As New DataSet
    Dim parent As DataTable = Me.GetRoomType()
    Dim child As DataTable = Me.GetRoomNumber()


    data.Tables.Add(parent)
    data.Tables.Add(child)
    data.Relations.Add("Rooms",
                           parent.Columns("roomtype.RoomTypeID"),
                           child.Columns("Rooms.rRoomTypeID"))
    Return data
End Function
Private Function GetRoomType() As DataTable
    Dim sql As String = "Select RoomTypeName, RoomTypeID FROM RoomType"
    Dim table As New DataTable("RoomType")
    Using con As New SQLiteConnection(ConStr)
        con.Open()
        Using da As New SQLiteDataAdapter(sql, con)
            da.Fill(table)

        End Using
    End Using
    Return table
End Function

Private Function GetRoomNumber() As DataTable
    Dim sql As String = "Select RoomNumber, RoomID, rRoomTypeID FROM Rooms INNER JOIN roomtype ON roomtype.roomtypeid = rooms.rroomtypeid ;"
    Dim table As New DataTable("RoomNumber")
    Using con As New SQLiteConnection(ConStr)
        con.Open()
        Using da As New SQLiteDataAdapter(sql, con)
            da.Fill(table)
        End Using
    End Using
    Return table
End Function
 

Мои sqltables, в которые мне затем нужно вставить выбранные данные:

СОЗДАЙТЕ ТАБЛИЦУ BookedRooms(brBookingID ЦЕЛОЕ ЧИСЛО, brRoomID ЦЕЛОЕ ЧИСЛО, Status VARCHAR (50) NULL, ВНЕШНИЙ КЛЮЧ (brBookingID) ССЫЛАЕТСЯ НА бронирование (BookingID), ВНЕШНИЙ КЛЮЧ (brRoomID) ССЫЛАЕТСЯ на номера (roomId) );

 CREATE TABLE RoomType(
 

Автоинкремент ПЕРВИЧНОГО КЛЮЧА с ЦЕЛЫМ ЧИСЛОМ RoomTypeID,
значение переменной RoomTypeName(50),
целое число емкости,
Цена номера РЕАЛЬНАЯ
);

 CREATE TABLE Rooms( 
 

ПЕРВИЧНЫЙ КЛЮЧ ЦЕЛОГО ЧИСЛА roomId,
ЦЕЛОЕ
число roomNumber, отдельная ПЕРЕМЕННАЯ (10),
ЦЕЛОЕ ЧИСЛО rRoomTypeID НЕ РАВНО НУЛЮ,
ВНЕШНИЙ КЛЮЧ (rRoomTypeID) ССЫЛАЕТСЯ на RoomType(RoomTypeID)
);

Комментарии:

1. Во-первых, почему вы делаете что-либо, связанное ComboBoxes с методами GetParentTable и GetChildTable ? Делает ли это исходный код? Нет, это не так. Все, что он делает, это создает DataTable , заполняет его и возвращает. Почему вы делаете что-то другое? Мало того, вы все равно не должны привязывать DataTables непосредственно к элементам управления. Если вы читаете комментарии в коде, то вы знаете шаги: получите, которые DataSet содержат таблицы и отношение, свяжите BindingSources , а затем свяжите выпадающие списки. Сделайте это.

2. Все, что вам нужно сделать, это начать с точного кода, который я вам предоставил, изменить методы GetParentTable и GetChildTable для заполнения DataTables из базы данных, а не вручную, а затем изменить имена таблиц и столбцов. Вам также необходимо добавить два BindingSources в форму в конструкторе, которые вы должны назвать, как вы это сделали ComboBoxes , а затем использовать для них соответствующие имена.

3. Не публикуйте длинные фрагменты кода в комментариях. Они едва читаемы. Если у вас есть дополнительная информация для предоставления, соответствующим образом обновите свой вопрос. Тем не менее, если вы проверите подпись под любым из моих сообщений в этой теме, вы найдете ссылку на все мои темы CodeBank, включая примеры кода с использованием ADO.NET для извлечения и сохранения данных. Возможно, вам стоит это проверить. Сказав это, я вижу вызов Fill метода адаптера данных в этом коде, поэтому он выглядит многообещающим.

4. Привет, я хотел спросить о последних нескольких строках вашего кода, где вы 'Add a relationship between the ID of the parent 'table and the ParentID of the child table. , как бы я это реализовал с базой данных.

5. Есть сама база данных со своей схемой, а затем есть ваше программное обеспечение, которое обращается к базе данных. Сначала вам нужно отобразить вашу схему, которая определяет отношения таблиц, затем вы можете закодировать для нее. Исследуйте диаграммы ER.