2014-12-11 3 views
0

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

У этого есть 3 поля, и одна из них - строка. Проблема заключается в том, что я получаю нарушение уникального ключа, когда я отправить эти две строки:

DB

First: Id-type int 
Second: PosId-type uniqueidentifier 
Third: Description-type nvarchar(256) 

Определено ограничений

ALTER TABLE dbo.StAPSachverhalte ADD CONSTRAINT 
    UQ_myuniqueKey UNIQUE NONCLUSTERED 
    (
     CompanyId, 
     PosId, 
     Description 
    ) WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

C# параметры кода

new SqlParameter("@Description", SqlDbType.NVarChar, 256), 
new SqlParameter("@PosId", SqlDbType.UniqueIdentifier), 
... 
MyParameters1[0].Value = _newData.Description; 
MyParameters1[1].Value = _newData.PosId; 

CommandText

@"INSERT INTO StAPSachverhalte( 
        [Description], 
        [PosId] 
        ) 
       VALUES ( 
        @Description, 
        @PosId) 
       SET @ID = SCOPE_IDENTITY()", 

Переданные данные

'1, random GUID, 001' 

'1, random GUID, 001 ' 

Если я не ошибаюсь, оба должны быть действительными, потому что '001' <> '001'.

Ошибка

Cannot insert duplicate key in object 'dbo.XXX'. The duplicate key value is (76, 9bcba4e1-4d16-487c-977f-cda933bb0955, 0001).

Я пытаюсь сохранить данные с нормальным SQLCommand ExecuteNonQuery с помощью Paramenters и я проверить myparameter [индекс] содержит соответствующее значение с пустым пространством в конце.

Любые идеи?

+0

Какие поля в вашей ограничения уникальности? –

+0

три поля должны быть уникальными вместе. Я опустил остальных из них, потому что они почти 15 ... – blfuentes

+0

Какова ваша база данных, как вы объявляете столбцы в базе данных (типы, длины и т. Д.), КОД, который вы используете для выполнения команды SQL, всю информацию, необходимую для помогите вам – Jauch

ответ

3

После некоторого исследования я нашел ответ, что, хотя вы действительно отправляете две разные строки, конечные пробелы не учитываются при сравнении строк DB. Включая уникальное сравнение при вставке.

Таким образом, чтобы работать, как вы хотите, вы должны добавить еще одно поле, как длина строки, как предложено здесь: MySQL database with unique fields ignored ending spaces

+0

Является ли это решение также для транзакций sql? – blfuentes

+0

@ blacai, за то, что я мог найти, да. – Jauch

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