我收到类似
的错误'City'上的'IsActive'属性无法设置为'System.Int32'值。必须将此属性设置为类型为“System.Boolean”的非空值。
我获得的IsActive
列的值为1
。
public List<City> AutoCompleteCity(string serachParameter)
{
var parameter = new SqlParameter("@SERACH", SqlDbType.VarChar);
parameter.Value = serachParameter;
//this is the place where i am getting error
var result = _dbContext.Database.SqlQuery<City>("EXEC USP_GET_CITY @SERACH", parameter).ToList();
return result;
}
// This is the city class
public partial class City
{
public int CityId { get; set; }
public string CityName { get; set; }
public Nullable<int> StateId { get; set; }
public Nullable<bool> IsActive { get; set; }
}
// stored procedure
Create procedure [dbo].[USP_GET_CITY]
@SERACH VARCHAR(100)
AS
BEGIN
SELECT CITYID,CITYNAME+' || ' + STA.STATENAME + ' || ' + CTRY.NAME AS
CityName,STA.StaeteId as StateId, 1 as IsActive
FROM CITY CTY
LEFT JOIN [STATE] STA
ON CTY.STATEID=STA.STAETEID
LEFT JOIN [COUNTRY] CTRY
ON CTRY.COUNTRYID=STA.COUNTRYID
WHERE CTY.CITYNAME LIKE '%'+@SERACH+'%'
OR STA.STATENAME LIKE '%'+@SERACH+'%'
OR CTRY.NAME LIKE '%'+@SERACH+'%'
END
答案 0 :(得分:2)
在SELECT
声明中,更改
1 as IsActive
到
CAST(1 AS BIT) as IsActive
或
CONVERT(BIT, 1) as IsActive
否则,1
默认被视为整数,这与C#定义中声明的类型不一致
答案 1 :(得分:0)
看起来您的存储过程将IsActive列作为整数返回,其中您的代码希望将其存储为布尔值。 检查你的db表定义,以确保列的定义也是一样,并且你的存储过程没有对它进行一些转换,使它成为一个整数。
答案 2 :(得分:0)
TSQL听起来有点棘手,实际上,sql server没有正确的bool数据类型,实际上没有rdms,因为bool实际上是一个长度为1位的整数
考虑到这一点,一旦强制了这个IsActive字段的长度,一个强制转换应该会有所帮助,我想如果你这样做而没有强制转换slq服务器将把它当作int32处理,所以:
SELECT CITYID,CITYNAME+' || ' + STA.STATENAME + ' || ' + CTRY.NAME AS
CityName,STA.StaeteId as StateId, CAST(1 as bit) as IsActive
是选项一,第二个是改变代码如何工作以接受int32而不是布尔类型,如:
public partial class City
{
public int CityId { get; set; }
public string CityName { get; set; }
public Nullable<int> StateId { get; set; }
public Nullable<int> IsActive { get; set; }
}