Сложные типы не показывают результата для хранимой процедуры

У меня есть хранимая процедура, которую я хотел бы использовать в веб-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) свою транзакцию.

Larnu 16.04.2019 12:58

правильно.но проблема не решена

JumpIntoTheWater 16.04.2019 13:04

Какую таблицу читает С#? Это io_sp_get_some_data_foo? Прочитайте таблицу в SSMS и посмотрите, содержит ли она данные? Похоже, SP загружает таблицу mainPrice, но я не уверен, что это то, что читает код С#.

jdweng 16.04.2019 13:06

@jdweng в основном, C# должен возвращать таблицу, созданную следующим образом select: SELECT CAST(0 as BIT) as 'Status', 'ADMIN - Unite Singles' as 'ReturnMessage'

JumpIntoTheWater 16.04.2019 13:08

Так где же код C#, вызывающий хранимую процедуру?

AsheraH 16.04.2019 13:12

Entity не смотрит на возвращаемые значения. Он имеет сопоставление с DataTable в базе данных. Вы можете создать представление в базе данных, а затем дать Entity прочитать представление.

jdweng 16.04.2019 13:15

Прежде чем приступить к работе с кодом, я хотел бы убедиться, что SP возвращает ожидаемое (в этом случае таблицу с двумя столбцами), а это не так. в Visual Studio под моделью EF у меня есть Complex Types который должен показать результат C#, которого в моем случае под Complex Types нет. Итак, у меня нет причин начинать писать свой код, пока мой SP ничего не возвращает.

JumpIntoTheWater 16.04.2019 13:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
99
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Проверьте, что происходит, когда вы вызываете свою процедуру с входными параметрами NULL. Если результат не является таблицей, EF не будет генерировать сложный результат.

он возвращает таблицу. Столбец 1 = Статус (со значением 0) и Столбец 2 = ReturnMessage (со значением ADMIN - Unite Singles)

JumpIntoTheWater 16.04.2019 13:19

Попробуйте следующее:

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

хорошее отношение, но это тоже не помогло.

JumpIntoTheWater 16.04.2019 14:02
Ответ принят как подходящий

Я узнал, что моя проблема связана с моей временной таблицей. при использовании SET FMTONLY OFF в верхней части моего SP или над временной таблицей (#mainPrice в моем случае), все работает как шарм, и внезапно Complex Types показывает мой SP.

Другое решение — использовать таблицу переменных: DECLARE TABLE @mainPrice. Оба делают работу.

Я буду рад узнать, почему это происходит и почему C# отказался получить временную таблицу как часть моего SP, но на данный момент я нашел нужное решение.

Другие вопросы по теме