Отключить IDENTITY_INSERT для вставки набора данных - PullRequest
27 голосов
/ 05 августа 2009

Я использую набор данных для вставки данных, конвертируемых из более старой базы данных. Требуется сохранить текущие номера Order_ID.

Я пытался использовать:

SET IDENTITY_INSERT orders ON;

Это работает, когда я в SqlServer Management Studio, я могу успешно

INSERT INTO orders (order_Id, ...) VALUES ( 1, ...);

Однако, это не позволяет мне делать это через вставку набора данных, которую я использую в своем скрипте преобразования. Который выглядит в основном так:

dsOrders.Insert(oldorderId, ...);

Я также запускал SQL (команды SET IDENTITY_INSERT ON) во время процесса. Я знаю, что я могу сделать это только против одного стола за раз, и я.

Я продолжаю получать это исключение:

Исключение при попытке вставить значение в таблицу заказов System.Data.SqlClient.SqlException: Невозможно вставить явное значение для столбца идентификаторов в таблице 'orders', когда для IDENTITY_INSERT установлено значение OFF.

Есть идеи?

Обновление

AlexS & AlexKuznetsov упомянули, что Set Identity_Insert является настройкой уровня соединения, однако, когда я смотрю на SQL в SqlProfiler, я замечаю несколько команд.

  • Первый - SET IDENTITY_INSERT DEAL ON
  • Второй - exec sp_reset_connection
  • В-третьих, мои различные команды sql, включая команды select & insert

Между командами всегда есть exec sp_reset_connection, но я считаю, что это является причиной потери значения в настройке Identity_Insert.

Есть ли способ, чтобы остановить мой набор данных от сброса соединения?

Ответы [ 6 ]

52 голосов
/ 05 августа 2009

У вас есть варианты, перепутанные:

SET IDENTITY_INSERT orders ON

превратит ON в возможность вставки определенных значений (которые вы укажете) в таблицу со столбцом IDENTITY.

SET IDENTITY_INSERT orders OFF

Снова отключает это поведение и восстанавливает нормальное поведение (вы не можете указать значения для столбцов IDENTITY, поскольку они генерируются автоматически).

Марк

5 голосов
/ 05 августа 2009

Вы хотите выполнить SET IDENTITY_INSERT ON , чтобы разрешить вставку в столбцы идентификаторов.

Кажется, немного задом наперед, но так оно и работает.

3 голосов
/ 05 августа 2009

Кажется, что вы все делаете правильно: SET IDENTITY_INSERT ордера ON - правильный путь на стороне SQL Server . Но проблема в том, что вы используете наборы данных. Из предоставленного вами кода я могу сказать, что вы используете типизированный набор данных - тот, который был сгенерирован в Visual Studio на основе базы данных.

Если это так (скорее всего), то этот набор данных содержит ограничение, которое не позволяет устанавливать значения для поля orderId, т.е. это код, который не позволяет указав явное значение, а не SQL Server. Вы должны перейти к конструктору набора данных и отредактировать свойства поля orderId: установите для AutoIncrement и ReadOnly значение false. Но те же изменения могут быть выполнены во время выполнения. Это позволит вам добавить строку с явным значением orderId к набору данных, а затем сохранить ее в таблице SQL Server (вам все равно понадобится SET IDENTITY_INSERT).

Также обратите внимание, что IDENTITY_INSERT - это настройка уровня соединения, поэтому вам нужно быть уверенным, что вы выполняете соответствующий SET точно для того же соединения, которое вы будете использовать для сохранения изменений в базе данных.

1 голос
/ 01 сентября 2009

AlexS был прав, проблема была в том, что работал Insert_Identity, но это настройка уровня соединения, поэтому мне нужно было установить Insert_Identity внутри транзакции.

Я использовал Ryan Whitaker's TableAdapterHelper code

и я создал команду обновления в моем табличном адаптере, который запустил Identity_Insert. Затем мне пришлось создать новую команду «Вставка» с указанным столбцом «Идентификация». Затем я запустил этот код

SqlTransaction transaction = null;

try
{
     using (myTableAdapter myAdapter = new myTableAdapter())
     {   
         transaction = TableAdapterHelper.BeginTransaction(myAdapter);
         myAdapter.SetIdentityInsert();
         myAdapter.Insert(myPK,myColumn1,myColumn2,...);
     }

     transaction.Commit();
 }
 catch(Exception ex)
 {
     transaction.Rollback();
 } 
 finally
 {
     transaction.Dispose();
 }
1 голос
/ 05 августа 2009

Я бы использовал Profiler, чтобы определить, включены ли ваши SET IDENTITY_INSERT; выдается из того же соединения, что и ваши последующие вставки, а также из точного SQL, выполняемого во время вставок.

0 голосов
/ 22 октября 2014

Если у вас все еще есть проблемы с "insert_identity", вы можете попробовать использовать полный оператор вставки , например:

вставить в User (Id, Name) значения (1, 'jeff')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...