c#中的转换问题

时间:2017-10-09 10:28:14

标签: c# sql entity-framework-6

我收到类似

的错误
  

'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

3 个答案:

答案 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; }
}