Чтобы добавить к тому, что AlbertK уже написал, но с использованием _1 _ / _ 2_.
Лучше всего использовать OUTPUT parameter
в вашей хранимой процедуре.
Представьте себе сценарий, в котором необходимо прочитать StatusCode из stored procedure
:
CREATE PROCEDURE dbo.spIfUserExists (
@Username VARCHAR(120),
@StatusCode INT OUTPUT,
) AS
BEGIN
IF EXISTS (SELECT * FROM dbo.[Users] WHERE Username=@Username)
SET @StatusCode = 1;
ELSE
SET @StatusCode = 0;
END
На самом деле вы ничего не возвращаете, кроме присваивания целого числа (INT
) output parameter
, которое будет доступно снаружи.
В вашем коде C # вам необходимо создать объект SQLParameter
с именем output parameter
из вашего stored procedure
.
SqlParameter StatusCode = new SqlParameter
{
ParameterName = "@StatusCode",
SqlDbType = System.Data.SqlDbType.Int,
//Direction of this parameter is output.
Direction = System.Data.ParameterDirection.Output
};
Наконец, выполните ExecuteSqlRawAsync
с необходимыми параметрами для вашего SP.
Где @p0,@p1..@pn
указывает позиционные аргументы вашей хранимой процедуры.
string Username = "MyRandomUsername";
using (var ctx = new UsersDbContext())
{
await ctx.Database.ExecuteSqlRawAsync(
"spIfUserExists @p0, @StatusCode OUT",
parameters: new object[] {
Username,
StatusCode,
});
}
//StatusCode now contains the status code from the [spIfUserExists].
Console.WriteLine(Convert.ToInt32(StatusCode.Value));
Для выходных параметров не требуются позиционные аргументы, как для обычных аргументов, например, Username
. Следовательно, вам не нужно передавать @p[n]
в OUTPUT arguments
, а только передавать их в список parameters
.
Нет никакой разницы в кодировании, если вы используете ExecuteSqlRaw
. Вам нужно всего лишь удалить ключевое слово await
, чтобы ExecuteSqlRaw
работал синхронно.
В вашей хранимой процедуре может быть несколько output parameter
с разными типами данных. Вам нужно только следовать той же схеме.
person
Volkan Güven
schedule
28.09.2020