Проблемы с IDENTITY_INSERT установлен в OFF?: - / - PullRequest
5 голосов
/ 11 июля 2011

Я пытаюсь вставить детали заказа в свою БД, и он продолжает говорить:

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

Все, что я пытаюсь сделать, это просто вставить UserId пользователя в столбец UserId, используя WebSecurity.CurrentUserId - Почему это не работает?

У меня есть:

dbase.Execute("INSERT INTO Orders 
                 (UserId, OrderId, Status) 
               VALUES 
                 (@0, @1, @2)", 
               WebSecurity.CurrentUserId, 
               Session["OSFOID"], 
               "Confirmed");`

Итак, как видите, все довольно просто.Но почему это не сработает?

Определение моей таблицы:

Table Definition

Ответы [ 6 ]

11 голосов
/ 11 июля 2011

Если только вы не включите возможность делать идентификационную вставку (установив идентификационную вставку на для этой таблицы), вы НЕ ДОЛЖНЫ касаться столбец - база данных владеет им.

Либо разрешите вставку идентификатора кратко , либо: не пытайтесь вставить идентификатор пользователя (разрешите БД создать новый идентификатор).

Согласно книгам в Интернете, SET IDENTITY_INSERT:

SET IDENTITY_INSERT Orders ON
INSERT INTO Orders (UserId, OrderId, Status) VALUES (@0, @1, @2)
SET IDENTITY_INSERT Orders OFF

Скорее, однако: если это таблица Orders, не должна ли личность быть на OrderId? У вас все еще будет та же проблема, поскольку вы, конечно, пытаетесь контролировать OrderId.

3 голосов
/ 11 июля 2011

Как правило, вы не хотите вставлять целое число в столбец первичного ключа. Обычно вы устанавливаете флаг «Идентичность» столбца в значение «истина» только в том случае, если вы хотите, чтобы SQL Server устанавливал целое число с автоинкрементом в этот столбец при вставке.

Как и в случае с ответом Марка Гравелла, вы можете включить идентификационную вставку, используя

SET IDENTITY_INSERT [ database. [ owner. ] ] { table } { ON | OFF }

Но делать это в обычном коде приложения действительно вредно для здоровья - у вас возникнут проблемы с параллелизмом и, скорее всего, дублирующиеся идентификаторы. Лучше не вводить идентификатор ордера - пусть БД сделает это за вас автоматически, а затем просто запросит новый идентификатор, используя @@IDENTITY (или лучше, SCOPE_IDENTITY()).

Если по какой-то причине вам определенно необходимо сохранить идентификатор сеанса пользователя, сделайте это отдельным столбцом в таблице заказов или, что еще лучше, в отдельной таблице пользователей, где UserId является внешним ключом.

2 голосов
/ 11 июля 2011

Вы не хотите, чтобы UserID был идентификатором, и я также не думаю, что вы хотите, чтобы UserID также был первичным ключом. Скорее всего, вы хотите, чтобы OrderID был первичным ключом или, в лучшем случае, общим первичным ключом с идентификаторами пользователя и orderid.

1 голос
/ 11 июля 2011

Вы установили IS Identity на YES , поэтому теперь вы не можете вставить значение для этого столбца. DB автоматически вставит его, увеличив значения.

И я вижу, что вы установили UserId в качестве первичного ключа таблицы, что неверно. Order OoderID должен быть первичным ключом столбца.

Установите для UserID IsIdentify значение false и OrderID IsEdentitfy для yes и сделал его столбцом первичного ключа.

1 голос
/ 11 июля 2011

В определении вашей таблицы установите Is Identity? как False, без установки, что вы не можете вручную вставить значение в UserID

0 голосов
/ 12 октября 2016

Интересно, что я обнаружил, что когда я создавал таблицу, используя «Выбрать ..... В [новую таблицу] из [таблиц, содержащих данные]», я впоследствии не мог вставить новые записи, получая для свойства Insert_Identity значение off.Я справился с этим, удалив таблицу, а затем с помощью сценария Create Table, чтобы восстановить ее, и теперь без проблем вставляю столько новых идентификаторов, сколько необходимо

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