Подтвердить что ты не робот

Отключите IDENTITY_INSERT для вставки набора данных

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

Я пробовал использовать:

SET IDENTITY_INSERT orders ON;

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

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

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

dsOrders.Insert(oldorderId, ...);

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

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

Исключение при попытке вставить значение в таблицу заказов System.Data.SqlClient.SqlException: не удается вставить явное значение для столбца идентификации в табличных "порядках", если для параметра IDENTITY_INSERT установлено значение "ВЫКЛ".

Любые идеи?

Обновить

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

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

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

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

4b9b3361

Ответ 1

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

SET IDENTITY_INSERT orders ON

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

SET IDENTITY_INSERT orders OFF

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

Марк

Ответ 2

Вы хотите сделать SET IDENTITY_INSERT ВКЛ, чтобы вы могли вставлять в столбцы идентификаторов.

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

и я создал команду update на моей таблице, которая запускала 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();
 }

Ответ 6

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

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