我的项目是MVC5,我正在尝试将用户数据从SqlMembership Provider导入Identity 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)-@fieldNameStart)
-- 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是否为空插入“NA”的建议。
答案 0 :(得分:1)
正如trailmax所指出的那样,问题是您正在尝试将null插入到不接受空值的列中。有两种可能的解决方案。一种是修改表以允许空值。如果表中已有数据,则可能存在此问题。另外,您可能是软件开发人员,而不是数据架构师。所以这可能不太可行。
我喜欢在SQL中使用isnull()函数,它大致相当于C#中的null coallescing运算符(??)。 isnull(parm1,parm2)如果不为null则返回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
(事后编辑了这个以获得更好的解释)
答案 1 :(得分:0)
如错误所示,该列不允许空值,但您尝试在那里插入null。因此,您需要更改该列以允许插入空值。
如果此表是由EF为您生成的,那么在您的模型中,您需要从属性[Required]
中删除FirstName
。然后创建一个新的迁移,修改数据库状态并再次尝试您的脚本。
如果EF没有为您创建该表,则需要修改列以允许空值:
ALTER TABLE bcrs_new.dbo.AspNetUsers
ALTER COLUMN FirstName nvarchar(max) NULL