У меня есть таблица базы данных с одним полем, называемым ID, которое является целым числом с автоинкрементом.
Используя TableAdapter, я могу читать и изменять существующие строки, а также создавать новые.
Однако, если я пытаюсь изменить вновь вставленную строку, я получаю исключение DBConcurrencyException:
OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Shift.mdb;Persist Security Info=True");
ShiftDataSetTableAdapters.ShiftTableAdapter shiftTA = new ShiftDataSetTableAdapters.ShiftTableAdapter();
shiftTA.Connection = conn;
ShiftDataSet.ShiftDataTable table = new ShiftDataSet.ShiftDataTable();
ShiftDataSet.ShiftRow row = table.NewShiftRow();
row.Name = "life";
table.Rows.Add(row);
shiftTA.Update(row); // row.ID == -1
row.Name = "answer"; // <-- all fine up to here
shiftTA.Update(row); // DBConcurrencyException: 0 rows affected
Отдельный вопрос, существует ли какой-либо статический тип метода NewShiftRow (), который я могу использовать, чтобы мне не приходилось создавать таблицу каждый раз, когда я хочу вставить новую строку.
Я полагаю, что проблема в коде происходит от row.ID, который все еще равен -1 после первого вызова Update (). Вставка выполнена успешно, и в базе данных строка имеет допустимое значение ID.
Как я могу получить этот идентификатор, чтобы я мог продолжить второй вызов на обновление?
Обновление:
Похоже, что это можно было сделать автоматически, используя этот параметр .
Однако, согласно ответу msdn social , драйверы OLEDB не поддерживают эту функцию.
Не знаете, куда идти, используйте что-то еще, кроме oledb?
Обновление:
Пробовал SQLCompact, но обнаружил, что у него такое же ограничение , он не поддерживает несколько операторов.
Последний вопрос: существует ли простая (на основе одного файла) база данных, которая позволила бы вам получить значения вставленной строки.