2010-07-06 3 views
0

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

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

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

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

Спасибо!

ответ

1

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

Надеются, что это помогает, Стиву

0

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

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" }); 
      } 
     } 
+0

Спасибо за ответ, но я думаю, что я искал что-то другое. Ваш подход должен работать, но моя цель состояла в том, чтобы организовать его таким образом, что мне больше не нужно назначать или проверять идентификаторы. По сути, любые «автономные» назначенные идентификаторы никогда не попадают в базу данных MySql, потому что оператор SQL insert не упоминает идентификатор. Вот почему я думал, что будет работать без них. – JayK

Смежные вопросы