-1

Мой проект MVC5, я пытаюсь импортировать данные пользователей из поставщика SqlMembership в Identity 2.0. Я использую:SQL GetProfileElement - перенос поставщика sqlmembership к идентификатору 2.0

dbo.fn_GetProfileElement('FirstName',Prfl.PropertyNames,Prfl.PropertyValuesString) FirstName, 

Я получаю следующее сообщение об ошибке:

Cannot insert the value NULL into column 'FirstName', table 'bcrs_new.dbo.AspNetUsers'; column does not allow nulls. INSERT fails. 

Вот функция:

ALTER FUNCTION [dbo].[fn_GetProfileElement] 
(
@fieldName AS NVARCHAR(100), 
@fields AS NVARCHAR(4000), 
@values AS NVARCHAR(4000)) 

RETURNS NVARCHAR(4000) 
AS 
BEGIN 
    -- If input is invalid, return null. 
    IF @fieldName IS NULL 
     OR LEN(@fieldName) = 0 
     OR @fields IS NULL 
     OR LEN(@fields) = 0 
     OR @values IS NULL 
     OR LEN(@values) = 0 

    RETURN NULL 

-- locate FieldName in Fields 
DECLARE @fieldNameToken AS NVARCHAR(20) 
DECLARE @fieldNameStart AS INTEGER, 
@valueStart AS INTEGER, 
@valueLength AS INTEGER 

-- Only handle string type fields (:S:) 
SET @fieldNameStart = CHARINDEX(@fieldName + ':S',@Fields,0) 

-- If field is not found, return null 
IF @fieldNameStart = 0 RETURN NULL 
SET @fieldNameStart = @fieldNameStart + LEN(@fieldName) + 3 

-- Get the field token which I've defined as the start of the 
-- field offset to the end of the length 
SET @fieldNameToken = SUBSTRING(@Fields,@fieldNameStart,LEN(@Fields)[email protected]) 

-- Get the values for the offset and length 
SET @valueStart = dbo.fn_getelement(1,@fieldNameToken,':') 
SET @valueLength = dbo.fn_getelement(2,@fieldNameToken,':') 

-- Check for sane values, 0 length means the profile item was 
-- stored, just no data 
IF @valueLength = 0 RETURN '' 

-- Return the string 
RETURN SUBSTRING(@values, @valueStart+1, @valueLength) 

END 

Я был бы признателен за ваши предложения о том, как проверить, если FirstName является null вставить «NA».

ответ

1

Как отмечалось в trailmax, проблема в том, что вы пытаетесь вставить нуль в столбец, который не принимает значения NULL. Существует два возможных решения. Один из них - изменить таблицу, чтобы разрешить нули. Если в таблице уже есть данные, могут возникнуть проблемы с этим. Кроме того, вы, вероятно, разработчик программного обеспечения, а не архитектор данных. Так что это может быть невыполнимо.

Мне нравится использовать функцию isnull() в SQL, которая примерно эквивалентна нулевому коллизионному оператору (??) в C#. IsNull (parm1, parm2) вернет parm1 если он не является нулевым, в противном случае он будет возвращать PARM 2.

Пример:

declare @myVar int 
set @myVar = null 
select isnull(@myVar, 1)  
-- Returns 1 
set @myVar = 2 
select isnull(@myVar, 1) 
-- Returns 2 

Так применяя это к вам фрагмент кода:

isnull(dbo.fn_GetProfileElement('FirstName',Prfl.PropertyNames,Prfl.PropertyValuesString),'NA') FirstName 

(Редактировано это после факта для лучшего объяснения)

+0

Спасибо, я получаю эту ошибку: Неправильный синтаксис около «FirstName». – hncl

+0

Я забыл закрытие круглых скобок. Я отредактировал свой ответ :) dbo.fn_GetProfileElement ('FirstName', Prfl.PropertyNames, Prfl.PropertyValuesString)) FirstName –

+0

Спасибо, теперь я получаю эту ошибку: функция isnull требует 2 аргумента (ов) – hncl

0

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

Если эта таблица была создана EF для вас, то в вашей модели вам необходимо удалить [Required] из свойства FirstName. Затем создайте новую миграцию, которая изменит состояние БД и снова попробует ваш скрипт.

Если эта таблица не была создана EF для вас, вы должны изменить столбец, чтобы аннулирует:

ALTER TABLE bcrs_new.dbo.AspNetUsers 
ALTER COLUMN FirstName nvarchar(max) NULL 
+0

К сожалению, таблица уже имеет данные и не может ее отбросить. Спасибо. – hncl

+0

В любом случае, вы это делаете, не нужно его бросать. Если вы создадите EF-Migration, у него будет инструкция для изменения таблицы без отбрасывания. Если вы запустите SQL-скрипт, он изменит столбец, не убивая данные. – trailmax

+0

Благодарим вас за отзыв, я уверен, что он будет полезен в будущем. – hncl