【问题标题】:Complex types show no result for a stored procedure复杂类型不显示存储过程的结果
【发布时间】:2019-09-06 11:03:43
【问题描述】:

我有一个存储过程,我想在 Web API (C#) 中使用它的结果。 我必须错过一些东西,因为我没有得到任何结果,也没有得到Complex Types(在EF模型中),也没有得到Functions Imports(我可以在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

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

【问题讨论】:

  • 如果你输入你的ELSE,你永远不会COMMIT(或ROLLBACK)你的交易。
  • 正确。但是问题还没有解决
  • c#在读什么表?是 io_sp_get_some_data_foo 吗?读取 SSMS 中的表并查看它是否包含数据?看起来 SP 正在加载表 mainPrice 但我不确定 c# 代码正在读取什么。
  • @jdweng 基本上,C# 应该返回由以下select 创建的表:SELECT CAST(0 as BIT) as 'Status', 'ADMIN - Unite Singles' as 'ReturnMessage'
  • 那么调用存储过程的C#代码在哪里呢?

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


【解决方案1】:

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

另一种解决方案是使用变量表:DECLARE TABLE @mainPrice。 两者都做。

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

【讨论】:

    【解决方案2】:

    尝试以下操作:

    -- 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
    
    

    【讨论】:

    • 态度很好,但也没有用。
    【解决方案3】:

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

    【讨论】:

    • 它返回一个表。第 1 列 = 状态(值为 0),第 2 列 = ReturnMessage(值为ADMIN - Unite Singles
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多