Тема: DataGridView Вставити в запис кілька таблиць

Намагаюся налаштувати роботу з таблицями зв'язаними як один до багатьох
(База даних SQLite)

Вдалося зробити коректне відображення таблиць за допомогою класу DataRelation, але з додаванням нових записів є така проблеми: При створенні нового рядка залежність між новими рядками таблиць пропадає, тобто поле зв'язку (батьківське id) зберігається як NULL

Команда для оновлення яка використовуються:

dataAdapter_ChannelList.UpdateCommand = new SQLiteCommandBuilder(dataAdapter_ChannelList).GetUpdateCommand();
            dataAdapter_ChannelName.UpdateCommand = new SQLiteCommandBuilder(dataAdapter_ChannelName).GetUpdateCommand();

Як зробити збереження таблиць які з'єднані зв'язком один до багатьох ?

Завантаження таблиць (для демонстрації, викликається при створені вікна)

ds = new DataSet();
            dataAdapter_ChannelList = new SQLiteDataAdapter("SELECT * FROM ChannelList", DB.SingleObject.connection);
            dataAdapter_ChannelList.Fill(ds, "ChannelList");
            dataAdapter_ChannelName = new SQLiteDataAdapter("SELECT * FROM ChannelName", DB.SingleObject.connection);
            dataAdapter_ChannelName.Fill(ds, "ChannelName");

            DataRelation dataRelation = new DataRelation(
                "ChannelList_ChannelName", 
                ds.Tables["ChannelList"].Columns["id"], 
                ds.Tables["ChannelName"].Columns["ChannelListID"]
                );
            ds.Relations.Add(dataRelation);

            BindingSource bindingSource_ChannelList = new BindingSource();
            BindingSource bindingSource_CL_CN = new BindingSource();

            bindingSource_ChannelList.DataSource = ds;
            bindingSource_ChannelList.DataMember = "ChannelList";
            bindingSource_CL_CN.DataSource = bindingSource_ChannelList;
            bindingSource_CL_CN.DataMember = "ChannelList_ChannelName";

            dataAdapter_ChannelList.UpdateCommand = new SQLiteCommandBuilder(dataAdapter_ChannelList).GetUpdateCommand();
            dataAdapter_ChannelName.UpdateCommand = new SQLiteCommandBuilder(dataAdapter_ChannelName).GetUpdateCommand();

            dataGridView_GroupNames.DataSource = bindingSource_ChannelList;
            dataGridView_ChannelNames.DataSource = bindingSource_CL_CN;

Збереження / оновлення таблиць (викликається при натискні кнопки зберегти)

        private void Save()
        {
            dataAdapter_ChannelList.Update(ds.Tables["ChannelList"]);
            dataAdapter_ChannelName.Update(ds.Tables["ChannelName"]);
        }

Ось так виглядають таблиці
https://i.ibb.co/R91CHX7/Untitled.png

2

Re: DataGridView Вставити в запис кілька таблиць

Є якісь ідеї ?

3

Re: DataGridView Вставити в запис кілька таблиць

1. Що саме ви вносите в таблицю?
2. Що в заноситься в dataAdapter_ChannelName.UpdateCommand?
3. В базі визначені Foreign Key?

4

Re: DataGridView Вставити в запис кілька таблиць

1) Для прикладу
Таб. №1 "ChannelList", поле "GroupName" я записую текст "Group1"
Таб. №2 "ChannelName", поле "CurrentChannelName" я записую тексти "Music channel", "Games channel"

В результаті таб. №2 ("ChannelName") зберігається без зовнішнього ключа (як NULL), а має зберігати ChannelList.id в полі ChannelName.ChannelListID


2) Команду в UpdateCommand заносить об'єкт SQLiteCommandBuilder класу

dataAdapter_ChannelList.UpdateCommand = new SQLiteCommandBuilder(dataAdapter_ChannelList).GetUpdateCommand();
            
dataAdapter_ChannelName.UpdateCommand = new SQLiteCommandBuilder(dataAdapter_ChannelName).GetUpdateCommand();

В дебагері (TextCommand) команди для оновлення виглядають так:

dataAdapter_ChannelList

UPDATE [main].[sqlite_default_schema].[ChannelList] SET [GroupName] = @param1 WHERE (([id] = @param2) AND ((@param3 = 1 AND [GroupName] IS NULL) OR ([GroupName] = @param4)))

dataAdapter_ChannelName

UPDATE [main].[sqlite_default_schema].[ChannelName] SET [ChannelListID] = @param1, [CurrentChannelName] = @param2 WHERE (([id] = @param3) AND ((@param4 = 1 AND [ChannelListID] IS NULL) OR ([ChannelListID] = @param5)) AND ((@param6 = 1 AND [CurrentChannelName] IS NULL) OR ([CurrentChannelName] = @param7)))

3)
ChannelList

CREATE TABLE "ChannelList" (
    "id"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    "GroupName"    TEXT
);

ChannelName

CREATE TABLE "ChannelName" (
    "id"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    "ChannelListID"    INTEGER,
    "CurrentChannelName"    TEXT,
    FOREIGN KEY("ChannelListID") REFERENCES "ChannelList"("id")
);

Зв'язок виглядає так
ChannelList.id -> ChannelName.ChannelListID

Подякували: koala, leofun012

5

Re: DataGridView Вставити в запис кілька таблиць

А ChannelName.ChannelListID може взагалі бути NULL, така можливість узагалі передбачається ? Якщо поставите там NOT NULL, щось зміниться.

Гм. Ви додаєте нові рядки до таблиці, а не змінюєте старі, правильно? Тобто UpdateCommand не стосується цього? І які ж ви там виставляєте значення ChannelListID? Якщо жодних, то не дивно, що там NULL заноситься. Автоматично виділенні значення навряд чи будуть заноситися в БД, треба їх вручну прописати - наприклад, додавши обробник DefaultValuesNeeded чи UserAddedRow і заповнивши там відповідний Cell.

Подякували: leofun01, Betterthanyou2