C# 为什么调用存储过程时出现异常?

C# 为什么调用存储过程时出现异常?,c#,.net,entity-framework,C#,.net,Entity Framework,我正在使用Entity Framework 6和Microsoft SQL Server 2012 以下是我的存储过程: ALTER PROCEDURE SPDeleteRegion @siteId int, @regionId int AS BEGIN SET NOCOUNT ON; DECLARE @isDeleted BIT IF EXISTS (SELECT 1 FROM SiteObjects WHERE SiteRegionI

我正在使用Entity Framework 6和Microsoft SQL Server 2012

以下是我的存储过程:

ALTER PROCEDURE SPDeleteRegion
      @siteId int,
      @regionId int 
AS
BEGIN 
    SET NOCOUNT ON;

    DECLARE @isDeleted BIT 

    IF EXISTS (SELECT 1 FROM SiteObjects WHERE SiteRegionId = @regionId)
    BEGIN
        SET @isDeleted = 0 ; --not deleted
        RETURN @isDeleted;
    END
    ELSE
    BEGIN
        --do what needs to be done if not       
        DELETE FROM SiteRegions 
        WHERE Id = @regionId;

        SET @isDeleted = 1;  -- deleted
        RETURN @isDeleted;
    END
END
下面是如何在C中调用存储过程:

var t = _context.Database.SqlQuery<bool>("SPDeleteRegion @siteId, @regionId",
                                          new SqlParameter("@siteId", siteId),
                                          new SqlParameter("@regionId", regionId));
在上面的代码行中,我得到了以下异常:

数据读取器有多个字段。多个字段对于EDM基元或枚举类型无效


你知道我为什么会得到这个异常以及如何修复它吗?

你的过程没有选择任何东西。更改如下:

ALTER PROCEDURE SPDeleteRegion
    -- Add the parameters for the stored procedure here
      @siteId int,
      @regionId int 
AS
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE 
    @isDeleted BIT 

    IF EXISTS (SELECT 1 FROM SiteObjects WHERE SiteRegionId = @regionId)
    BEGIN
        SET @isDeleted = 0 ; --not deleted
        SELECT @isDeleted [IsDeleted]; --HERE
    END
    ELSE
    BEGIN
        --do what needs to be done if not       
        DELETE FROM SiteRegions WHERE Id = @regionId;
        SET @isDeleted = 1;--deleted
        SELECT @isDeleted [IsDeleted]; -- AND HERE
    END
END

您的过程没有选择任何内容。更改如下:

ALTER PROCEDURE SPDeleteRegion
    -- Add the parameters for the stored procedure here
      @siteId int,
      @regionId int 
AS
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE 
    @isDeleted BIT 

    IF EXISTS (SELECT 1 FROM SiteObjects WHERE SiteRegionId = @regionId)
    BEGIN
        SET @isDeleted = 0 ; --not deleted
        SELECT @isDeleted [IsDeleted]; --HERE
    END
    ELSE
    BEGIN
        --do what needs to be done if not       
        DELETE FROM SiteRegions WHERE Id = @regionId;
        SET @isDeleted = 1;--deleted
        SELECT @isDeleted [IsDeleted]; -- AND HERE
    END
END

为什么将bool指定为类型参数_context.Database.SqlQuery?您的过程不会返回任何内容。它不会返回以下内容:@isDeleted;我正在使用Oracle。在Oracle中,若要从过程返回某些内容,必须在过程声明中将其指定为输出参数。其他数据库不是这样吗?您尚未在过程声明时声明isDeleted。SQL Server中存储过程的返回值始终为INT或bigint-通常表示有多少行受到插入、更新或删除操作的影响。不能使用RETURN关键字发回位-您需要使用输出参数,或者需要选择位并返回结果set@marc_s如果没有行受影响,为什么返回-1?为什么将bool指定为类型参数_context.Database.SqlQuery?您的过程不会返回任何内容。它不会返回以下内容:@isDeleted;我正在使用Oracle。在Oracle中,若要从过程返回某些内容,必须在过程声明中将其指定为输出参数。其他数据库不是这样吗?您尚未在过程声明时声明isDeleted。SQL Server中存储过程的返回值始终为INT或bigint-通常表示有多少行受到插入、更新或删除操作的影响。不能使用RETURN关键字发回位-您需要使用输出参数,或者需要选择位并返回结果set@marc_s如果没有影响行,为什么返回-1?