База данных и DataSet не синхронизируются относительно автоматического увеличения идентификатора

Я создал базу данных (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 в порядке). В частности, чтобы синхронизировать два ...

Что я пропустил ? Я совершенно уверен, что что-то неправильно понял.


person Utundu    schedule 14.10.2015    source источник


Ответы (1)


Согласно MSDN,

По умолчанию AcceptChanges вызывается неявно после обновления, и исходные значения в строке, которые могли быть значениями AutoIncrement, назначенными ADO.NET, теряются.

Таким образом, вам необходимо создать стратегию для объединения значения AutoIncremented Либо через ADO, либо получить обратно увеличенный идентификатор из Sql в качестве выходного параметра, а затем объединить значение столбца Identity, как указано в этом MSDN Статья.

person vendettamit    schedule 14.10.2015
comment
Большое вам спасибо, я этого не знала! - person Utundu; 15.10.2015