2009-08-05 4 views
22

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

Я попытался с помощью:

SET IDENTITY_INSERT orders ON; 

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

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

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

dsOrders.Insert(oldorderId, ...); 

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

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

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

Любые идеи?

Update

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

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

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

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

ответ

49

У вас есть варианты вперемешку:

SET IDENTITY_INSERT orders ON 

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

SET IDENTITY_INSERT orders OFF 

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

Marc

+0

Lol, у меня была такая же глупая ошибка – Jupaol

5

Вы хотите сделать SET IDENTITY_INSERT ON, чтобы вставить в столбцы идентичности.

Немного назад, но так оно и работает.

+0

Вы были правы, что у меня были варианты перепутаны, но когда я их сменил, он не разрешил мои проблемы. Любые другие идеи? –

3

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

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

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

1

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

1

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

Я использовал TableAdapterHelper код Райан Уайтейкера

и я создал команду обновления на моем TableAdapter, который управлял IDENTITY_INSERT. Затем мне пришлось создать новую команду Insert с указанным столбцом Identity. Я побежал этот код

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

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

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

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