Я создал базу данных (Microsoft SqlServerCe.4.0) с помощью Visual Studio и одну таблицу, содержащую два поля:
- id: int, первичный ключ, не null, уникальный, без значения по умолчанию, идентификатор
- ном, мы не заботимся об этом
Затем я создал DataSet, содержащий эту таблицу как DataTable, и у меня есть DataAdapter, подобный этому:
marque_adapter = factory.CreateDataAdapter();
command = connection.CreateCommand();
command.CommandText = "SELECT * FROM " + DB_TABLE_MARQUE + ";";
marque_adapter.SelectCommand = command;
command = connection.CreateCommand();
command.CommandText = "UPDATE " + DB_TABLE_MARQUE + " SET nom = @nom WHERE id = @id;";
CreateAndAddParameterFromSource(command, "id", "id");
CreateAndAddParameterFromSource(command, "nom", "nom");
marque_adapter.UpdateCommand = command;
command = connection.CreateCommand();
command.CommandText = "DELETE " + DB_TABLE_MARQUE + " WHERE id = @id;";
CreateAndAddParameterFromSource(command, "id", "id");
marque_adapter.DeleteCommand = command;
command = connection.CreateCommand();
command.CommandText = "INSERT INTO " + DB_TABLE_MARQUE + " (nom) VALUES (@nom);";
CreateAndAddParameterFromSource(command, "nom", "nom");
marque_adapter.InsertCommand = command;
//...
data = new DataSet();
marque_adapter.Fill(data, DB_TABLE_MARQUE);
Проблема возникает, когда я пытаюсь вставить новую строку. Я делаю :
- table.NewRow ()
- установить поле "nom"
- table.Rows.Add (newRow)
- адаптер.Update (набор данных, имя_таблицы)
Если я больше ничего не сделаю, у меня возникнут проблемы позже, когда я попытаюсь получить идентификатор этой строки (я предполагаю, что он установит его где-то между четырьмя инструкциями выше). Я ожидал, что DataTable позаботится о его создании, но ...
Поэтому я попытался напомнить DataTable, чтобы он позаботился об автоматическом увеличении:
idColumn.Unique = true;
idColumn.AutoIncrement = true;
Теперь он работает в первый раз, но когда я запускаю программу во второй раз, она снова начинает отсчет с единицы, и мне говорят, что идентификатор должен быть уникальным. Если я удалю базу данных (копию файла sdf, созданную Visual), или если я удалю строки вручную с помощью Visual, она будет работать хорошо в первый раз, и после этого я получу ту же ошибку.
Проблема на самом деле заключается в том, что я пытаюсь сохранить свой DataSet, особенно при добавлении новых строк (выбор, обновление, удаление в порядке).
Очевидно, я не понял, как управлять первичными ключами, когда задействованы DataTable и база данных (только datatable в порядке). В частности, чтобы синхронизировать два ...
Что я пропустил ? Я совершенно уверен, что что-то неправильно понял.