ConstraintException для DataTable.Rows.Add с автоинкрементным столбцом - PullRequest
0 голосов
/ 06 июля 2010

У меня есть несколько DataTables со столбцом ID с включенным AutoIncrement как на стороне сервера MySQL, так и на стороне схемы ADO.NET (загружается из файла схемы XML). Я не хотел бы заботиться об этих идентификаторах при вставке строк, потому что их единственное использование - иметь первичный ключ для таблицы - здесь нет ссылок на внешние ключи. Однако DataTable уже будет содержать строки, когда будут добавлены новые строки, т.е. е. строки с идентификаторами, начинающимися с 1, уже находятся в DataTable.

Значение AutoIncrementSeed по умолчанию для столбца ID равно -1, а значение AutoIncrementStep равно 1 (только значения по умолчанию, предоставленные Visual Studio). Все выглядит вполне нормально, если я хочу вставить только две новые строки одновременно, потому что при создании с помощью dataTable.NewRow () они получают идентификаторы -1 и 0. Но если я хочу добавить третью строку, он получает идентификатор 1 назначено NewRow (). Впоследствии возникает ConstraintException, когда я хочу вставить новую строку с dataTable.Rows.Add (...), потому что уже есть строка с ID = 1.

Я полагаю, что отключение функции AutoIncrement для схемы ADO.NET не является решением, потому что тогда мне все равно придется убедиться, что идентификаторы уникальны, прежде чем добавлять строки с помощью .Rows.Add ()

Каким было бы простое / элегантное решение этой проблемы? Сейчас я не могу себе представить, что это очень необычная задача.

Спасибо!

Ответы [ 2 ]

1 голос
/ 10 ноября 2010

Очень простой способ решения этой проблемы - установить для свойства AutoIncrementStep также значение -1 - тогда идентификаторы уменьшатся, т. Е. -1, -2, -3 и т. Д.

Надеюсь, это поможет,Стив

0 голосов
/ 06 июля 2010

Можете ли вы попробовать что-то похожее на пример, который я привел ниже.Вы можете проверить, существует ли уже уникальное значение столбца, используя Выбрать в таблице, прежде чем добавить еще одну строку:

using (SqlConnection connection = new SqlConnection(sqlConnectionStr))
        {
            connection.Open();
            // Do work here.
            DataTable userTable = new DataTable("usertable");

            using (SqlCommand sqlCmd = new SqlCommand("select * from [user]"))
            {
                sqlCmd.Connection = connection;
                SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlCmd);
                dataAdapter.Fill(userTable);
            }

            int newUserId = 3;
            DataRow[] selectedRows = userTable.Select(  string.Format( "id={0}", newUserId));
            bool userIdAlreadyTaken = selectedRows.Length > 0 ;
            if( !userIdAlreadyTaken )
            {
                // Add new user
                DataRow newRow = userTable.Rows.Add(new object[] { 3, "John" });
            }
        }
...