|
12 / 12 / 5
Регистрация: 06.03.2012
Сообщений: 182
|
|
SQLite Добавление новой строки в DataTable и первичный ключ28.03.2015, 09:43. Показов 4415. Ответов 6
Метки нет (Все метки)
В SQLite при указании первичного ключа у таблице типа INTEGER, тот автоматически становиться автоинкрементируемым, что очень удобно - не нужно беспокоится о создании уникальных значений при добавлении записи.
Через SQLiteDataAdapter наполнил DataTable строками из этой таблицы (метод Fill). Теперь нужно добавить новую запись в таблицу БД через добавление новой строки в DataTable и вызова метода Update у адаптера. При добавлении новой строки я не указываю поле с первичным ключом, СУБД его сама создаст обеспечив последовательность и уникальность. Все так и происходит, Update добавляет новую запись в БД. Тут же возникает проблема. DataTable не вкурсе, что и как там с этим полем и в итоге он содержит две строки - одну без Id созданную мной, а вторую с Id сгенерированную СУБД. При попытке добавить еще одну строку по томуже алгоритму (без указания Id) он говорит, что добавление невозможно т.к. такой Id уже существует (пустое значение). В попытках удалить сразу после добавления строку без Id, при следующем обновлении адаптер выполнит запрос DELETE в СУБД на удаление записи с пустым Id, которого естественно в БД нет... По этой причине вообще отказался от использования DataTable в пользу коллекций объектов (List<Item>), но там еще больше гемороя с сортировкой и фильтрацией отображения (через BindingSource), с чем DataTable справляется на ура. Кто-нибудь сталкивался с подобной проблемой? PS - пытался использовать GUID для первичного ключа и сохранять его как поле TEXT, вариант очень костыльный, т.к. СУБД дополнительно еще создает столбец rowid типа INTEGER...получается хлам.
0
|
|
| 28.03.2015, 09:43 | |
|
Ответы с готовыми решениями:
6
Получить первичный ключ после новой записи, как? Добавление записи в базу, если в полях автоинкремент и первичный ключ Замена данных в таблице по связи Первичный ключ - Вторичный ключ |
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
| 28.03.2015, 13:29 | |
|
Castello2401, это не проблема. Это особеность. Вам нужно после выполнения INSERT'а считать вставленный id, и занести его в DataTable. По-моему, в SQLite это делается функцией last_insert_rowid. Выполнять запрос с получением результата этой функции лучше во время события SQLiteDataAdapter.RowUpdated. С телефона мне сейчас сложно подробнее объяснить. Поищите на форуме. Я точно уже несколько раз этот трюк показывал на этом форуме, только для SQL Server.
1
|
|
|
12 / 12 / 5
Регистрация: 06.03.2012
Сообщений: 182
|
||
| 28.03.2015, 14:39 [ТС] | ||
|
0
|
||
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
| 28.03.2015, 15:36 | |
Сообщение было отмечено Castello2401 как решение
Решение
Castello2401, Чудес не бывает. Запись в БД можно вставить только выполнив команду INSERT. Эта команда выполняется из адаптера - этого достаточно. Вам всего лишь нужно после того, как адаптер выполнил эту команду, считать ид последней вставленной записи. После вставки/изменения/удаления каждой строки возникает событие RowUpdated, при обработке которого иожно подкорректировать обработанную строку DataTable'а.
0
|
|
|
12 / 12 / 5
Регистрация: 06.03.2012
Сообщений: 182
|
||||||
| 28.03.2015, 15:54 [ТС] | ||||||
|
Вроде все понятно, код:
0
|
||||||
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
| 28.03.2015, 16:03 | |
|
Castello2401, Даже правила английского языка говорят, что это событие происходит после Update'а строки. Хотя может для SQLite есть своя специфика ... За компьютером окажусь, обязательно провнрю.
0
|
|
|
12 / 12 / 5
Регистрация: 06.03.2012
Сообщений: 182
|
||||||||||||||||
| 28.03.2015, 18:07 [ТС] | ||||||||||||||||
|
Есть, заработало!
Вся проблема в соединении, функция last_insert_rowid() возвращает последний ключ ТЕКУЩЕГО соединения. В моем случае открывалось два соединения с БД, первое открывал адаптер при обновлении:
Добавлено через 8 минут -----FINAL----- Следующий код будет работать с любыми таблицами где первичный ключ называется "Id", просто вешаем на событие RowUpdated нужного адаптера.
0
|
||||||||||||||||
| 28.03.2015, 18:07 | |
|
Помогаю со студенческими работами здесь
7
Вставка новой строки. Связь с DataTable() Первичный ключ Первичный ключ первичный ключ
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|