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