首页 > 解决方案 > 使用存储过程时,从具体化的“System.Int32”类型到“System.String”类型的指定转换无效

问题描述

我有一个如下所示的存储过程:

ALTER PROCEDURE [dbo].[sp_SearchUnit]
    @UnitName VARCHAR(50)
AS
BEGIN
    SELECT
        b.NewBuildingId,
        b.NewBuildingName,
        u.PropertyUnitId,
        u.[Owner],
        p.FirstName,
        p.MiddleName,
        p.LastName,
        u.ParkingAreaSqMeters,
        u.PostingDateTime,
        u.TypeOfUnit,
        u.UnitName,
        u.WithParking
    FROM 
        [Property].[Unit_Rev] AS u
    LEFT JOIN
        [dbo].[Building_Rev] AS b ON u.BuildingId = b.NewBuildingId
    LEFT JOIN
        [dbo].[Person] AS p ON u.Owner = p.PersonId
    WHERE
        u.UnitName LIKE '%'+@UnitName+'%'
END

在我的 Web API 中,我像这样访问这个存储过程:

[HttpPost]
[Route("api/searchunitbyunitname")]
public async Task<List<SearchUnit>> SearchUnitByUnitName()
{
    var req = HttpContext.Current.Request;
    var unitName = req["unitname"];

    const string query = "sp_SearchUnit @UnitName";

    using (var db = new PmisDbContext())
    {
        try
        {
            object[] parameters =
            {
                new SqlParameter
                {
                    ParameterName = "@UnitName",
                    Value = unitName,
                    Direction = ParameterDirection.Input
                }
            };

            var list = await db.Database.SqlQuery<SearchUnit>(query, parameters).ToListAsync();

            return list;
        }
        catch(Exception ex)
        {
            return null;
        }
    }
}

我的“SearchUnit”课程是:

public class SearchUnit
{
        public string NewBuildingId { get; set; }
        public string NewBuildingName { get; set; }
        public string PropertyUnitId { get; set; }
        public string Owner { get; set; }
        public string FirstName { get; set; }
        public string MiddleName { get; set; }
        public string LastName { get; set; }
        public string ParkingAreaSqMeters { get; set; }
        public string PostingDateTime { get; set; }
        public string TypeOfUnit { get; set; }
        public string UnitName { get; set; }
        public string WithParking { get; set; }
}

为什么我会收到此错误:

从具体化的“System.Int32”类型到“System.String”类型的指定转换无效

如果我在 SQL Server Management Studio 中运行存储过程,我会得到我的结果。

感谢您的帮助。

标签: c#sql-serverasp.net-web-apistored-procedures

解决方案


有必要确保SqlQuery声明中使用的所有目标类属性与从数据库中检索的物化数据类型完全相同的数据类型,例如,列名中带有后缀“Id”的数据类型应调整为int

public int NewBuildingId { get; set; }

public int PropertyUnitId { get; set; }

对目标类中的所有属性使用数据类型并不是一个好主意,因为在使用方法时string没有从物化数值数据类型到类型的自动转换。stringDatabase.SqlQuery<TElement>


推荐阅读