У меня есть хранимая процедура, которую я хотел бы использовать в веб-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
Обратите внимание: при автономном запуске хранимой процедуры она работает отлично и возвращает то, что ожидалось.
правильно.но проблема не решена
Какую таблицу читает С#? Это io_sp_get_some_data_foo? Прочитайте таблицу в SSMS и посмотрите, содержит ли она данные? Похоже, SP загружает таблицу mainPrice, но я не уверен, что это то, что читает код С#.
@jdweng в основном, C# должен возвращать таблицу, созданную следующим образом select: SELECT CAST(0 as BIT) as 'Status', 'ADMIN - Unite Singles' as 'ReturnMessage'
Так где же код C#, вызывающий хранимую процедуру?
Entity не смотрит на возвращаемые значения. Он имеет сопоставление с DataTable в базе данных. Вы можете создать представление в базе данных, а затем дать Entity прочитать представление.
Прежде чем приступить к работе с кодом, я хотел бы убедиться, что SP возвращает ожидаемое (в этом случае таблицу с двумя столбцами), а это не так. в Visual Studio под моделью EF у меня есть Complex Types который должен показать результат C#, которого в моем случае под Complex Types нет. Итак, у меня нет причин начинать писать свой код, пока мой SP ничего не возвращает.





Проверьте, что происходит, когда вы вызываете свою процедуру с входными параметрами NULL. Если результат не является таблицей, EF не будет генерировать сложный результат.
он возвращает таблицу. Столбец 1 = Статус (со значением 0) и Столбец 2 = ReturnMessage (со значением ADMIN - Unite Singles)
Попробуйте следующее:
-- 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
хорошее отношение, но это тоже не помогло.
Я узнал, что моя проблема связана с моей временной таблицей.
при использовании SET FMTONLY OFF в верхней части моего SP или над временной таблицей (#mainPrice в моем случае), все работает как шарм, и внезапно Complex Types показывает мой SP.
Другое решение — использовать таблицу переменных: DECLARE TABLE @mainPrice.
Оба делают работу.
Я буду рад узнать, почему это происходит и почему C# отказался получить временную таблицу как часть моего SP, но на данный момент я нашел нужное решение.
Если вы введете свой
ELSE, вы никогда неCOMMIT(илиROLLBACK) свою транзакцию.