Использование uniqueidentifier в качестве первичного ключа и вставка его из клиентского приложения с помощью параметризованных запросов - PullRequest
2 голосов
/ 11 ноября 2009

Я создал базу данных, где я использую uniqueidentifier в качестве первичного ключа. Я пытаюсь запустить параметризованный запрос, который в итоге выглядит следующим образом. (вставить в значения someTable (uniqueID) ('76c14693-5475-4224-ba94-7d30c919ac59') (uniqueID - это мой PK). Этот оператор вставки выполняется без проблем, когда я запускаю его в SQL Server Management Studio, однако он завершается неудачно, когда я попробуй запустить его из моего кода.

Ошибка: невозможно вставить явное значение для столбца идентификации в таблице 'someTable', когда для IDENTITY_INSERT задано значение OFF.

Я посмотрел это, и есть много предложений по включению IDENTITY_INSERT, но все они используют хранимые процедуры. Мне нужно быть в состоянии сделать это с помощью параметризованного запроса. Или мне нужен способ, чтобы получить недавно созданный guid в базе данных. Это похоже на то, что всем понадобится в какой-то момент. Есть ли простые решения?

PS. Мне нужен идентификатор, потому что мне нужно добавить записи в другие таблицы, используя этот идентификатор.

EDIT:

Вот структура рассматриваемой таблицы

CREATE TABLE [dbo].[someTable]
( 
        [NewsID] [uniqueidentifier] NOT NULL CONSTRAINT [DF_someTable_NewsID] DEFAULT (newid()), 
        [ShortTitle] [nvarchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
        [DateCreated] [datetime] NULL CONSTRAINT [DF_someTable_DateCreated] DEFAULT (getdate()), 
        CONSTRAINT [PK_cmc_News_1] PRIMARY KEY CLUSTERED ( 
            [NewsID] ASC )WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF
        ) ON [PRIMARY] 
) ON [PRIMARY]

Ответы [ 4 ]

3 голосов
/ 11 ноября 2009

На самом деле, у вас должна быть какая-то другая проблема или какой-то другой столбец в вашей таблице, потому что вы получите эту ошибку, только если у вас есть столбец IDENTITY в вашей таблице, а столбцы IDENTITY не могут иметь тип уникального идентификатора типа данных. Вы уверены, что вставляете в ту же таблицу, или не используете какой-либо инструмент ORM, который пытается указать конкретное значение для столбца идентификаторов? Возможно, вы могли бы написать сценарий определения таблицы и прикрепить его?

РЕДАКТИРОВАТЬ: Добавление дополнительной информации, поскольку вопрос теперь включает в себя схему.

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

0 голосов
/ 11 ноября 2009

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

SET IDENTITY_INSERT <tablename> ON 
0 голосов
/ 11 ноября 2009

Вы установили для свойства Identity значение On, что означает, что база данных создает идентификатор при вставке записи. Если для поля для Identity установлено значение «Выкл.», Вы можете установить значение для вставки.

В качестве альтернативы, позвольте базе данных создать идентификатор, а затем получить созданный идентификатор:

insert into someTable ();select scope_identity()

Примечание. Хранимая процедура и параметризованный запрос не являются исключительными. Я всегда вызываю хранимые процедуры, используя параметризованный запрос.

0 голосов
/ 11 ноября 2009

В первую очередь GUIDs - ужасный выбор для первичных ключей.

Однако, если вы используете их, вам также не следует указывать то же поле, что и поле идентификации. Пожалуйста, опубликуйте код структуры вашей таблицы, и мы поможем вам переопределить его правильно.

...