复杂类型对存储过程无结果

时间:2019-04-16 10:56:32

标签: c# sql-server entity-framework stored-procedures

我有一个存储过程,我想在Web API(C#)中使用它的结果。 我必须错过一些东西,因为我没有结果,也没有Complex Types中的Functions Imports(在EF模型中)(我可以在Functions Imports中看到存储过程,但是它没有返回任何值,如预期的那样。)

这是我的存储过程(为了简化起见,我已经删除了一些不重要的数据)

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


    @main_id BIGINT, 
    @id_ze_mish BIGINT, 
    @id_nof BIGINT, 
    @loggedInUser VARCHAR(20) 
AS
BEGIN
    SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION [TransactionUniteSingles]

OPEN SYMMETRIC KEY io_key DECRYPTION BY CERTIFICATE chn_cert

    -- Step 1
    UPDATE [dbo].[t1]
    SET deleted = 1,
    WHERE id_nof = @id_nof
      AND id_ze  = @id_ze_mish

    -- Step 2
    UPDATE [dbo].[t_no_nir]
    SET update_stamp = GETDATE(),
        [user_name] = @loggedInUser
    WHERE id_nof = @id_nof
      AND ms_zehut_mazmin  = @id_ze_mish 

    -- Step 3
    CREATE TABLE #mainPrice
    (
         id INT,
         fName VARCHAR(20),
         lName VARCHAR(20)
    )

    INSERT INTO #mainPrice 
        EXEC  [dbo].[io_sp_get_some_data_foo] @id

    IF(EXISTS(select * from #mainPrice))
    BEGIN
        DECLARE @totalAmount INT;

        SELECT @totalAmount = (main_price + price_tip + price_visa) 
        FROM #mainPrice

        DROP TABLE #mainPrice

        UPDATE [dbo].[t_4] 
        SET amount = @totalAmount,
            update_stamp = GETDATE(),
            [user_name] = @loggedInUser
        WHERE id_nof = @id_nof
          AND id  = @main_id

    CLOSE ALL SYMMETRIC KEYS

    COMMIT TRANSACTION [TransactionUniteSingles]      
    SELECT CAST(1 as BIT) as 'Status', 'Succeeded' as 'ReturnMessage'
    END
ELSE
    BEGIN
    SELECT CAST(0 as BIT) as 'Status', 'ADMIN - Unite Singles as 'ReturnMessage'       
    END 
END TRY

BEGIN CATCH
ROLLBACK TRANSACTION [TransactionUniteSingles]
SELECT CAST(0 as BIT) as 'Status', 'ADMIN - Unite Singles' as 'ReturnMessage'       
END CATCH

END

请注意-以独立方式运行存储过程时,它可以完美运行并返回预期的结果。

3 个答案:

答案 0 :(得分:0)

检查使用NULL输入参数调用过程时会发生什么。如果结果不是表,则EF将不会生成复杂结果。

答案 1 :(得分:0)

尝试以下操作:

-- declare table at SP begin
DECLARE @ResultTable TABLE(
    Status BIT NOT NULL,
    ResultMessage NVARCHAR(50) NOT NULL
)

-- insert data where you need
INSERT INTO @ResultTable
(
    Status,
    ResultMessage
)
VALUES
(   NULL, -- Status - bit
    N''   -- ResultMessage - nvarchar(50)
    )

-- at SP end select result from table
SELECT * FROM @ResultTable

答案 2 :(得分:0)

我发现我的问题出在我的临时表上。 当在我的SP的顶部或临时表的上方(在我的情况下为SET FMTONLY OFF)上使用#mainPrice时,一切都像一个超级按钮,Complex Types突然显示了我的SP。

另一种解决方案是使用变量表:DECLARE TABLE @mainPrice。 两者都可以完成工作。

我很高兴知道为什么会发生这种情况以及为什么C#拒绝将临时表作为我的SP的一部分,但此刻我找到了所需的解决方案。