Альтернативный способ получить выходной параметр из хранимой процедуры
Мне нравится использовать Dapper для своих нужд ORM, но я знаю, что должен быть лучший способ вставить / обновить базу данных моего сервера sql с использованием хранимой процедуры и строго типизированных списков.
Например:
У меня есть класс песни:
public class Song
{
public int Id { get; set; }
public string title { get; set; }
public string genre { get; set; }
}
и кто-то представляет список песен:
List<Song> songs = new List<Song> {
new Song { Id = 1, title = "Song 1" , genre="rock"},
new Song { Id = 2, title = "Song 2" , genre="disco"}};
Я хочу обновить базу данных, используя мою хранимую процедуру, которая либо вставляет новую песню, либо обновляет ее, если она уже существует. Моя хранимая процедура имеет два выходных параметра:@success_added int = 0 and @success_updated int = 0
мой sproc выглядит следующим образом:
ALTER PROCEDURE [dbo].[UpdateSong]
@Id int = 0,
@title varchar(25) = NULL,
@genre varchar(25) = NULL,
@success_updated bit = 0 OUTPUT,
@success_added bit = 0 OUTPUT
AS
IF NOT EXISTS (SELECT Id FROM Songs WHERE Id = @Id)
BEGIN
INSERT INTO Songs
(
-- Id created by db
title,
genre
)
VALUES
(
@title,
@genre
)
SELECT @Success_Added = 1, @Success_Updated = 0
END
ELSE -- song already exists
BEGIN
UPDATE Songs
SET
title = @title,
@genre = @genre
WHERE Id = @Id
SELECT @Success_Added = 0, @Success_Updated = 1
END
RETURN
Я знаю, что это работает:
dbConn.Open();
DynamicParameters p = new DynamicParameters();
foreach (var song in songs)
{
p.Add("@Id", song.Id);
p.Add("@title", song.title);
p.Add("@genre", song.genre);
p.Add("@success_updated", dbType: DbType.Boolean, direction: ParameterDirection.Output);
p.Add("@success_added", dbType: DbType.Boolean, direction: ParameterDirection.Output);
dbConn.Execute("Test_UpdateSong", p, commandType: CommandType.StoredProcedure);
Console.WriteLine("@success_added: " + p.Get<Boolean>("@success_added"));
Console.WriteLine("@success_updated: " + p.Get<Boolean>("@success_updated"));
}
dbConn.Close();
Но для этого необходимо вручную преобразовать каждое свойство Song в анонимный тип DynamicParameter. Я бы предпочел просто сделать это:
dbConn.Open();
foreach (var song in songs)
{
var updateResult = dbConn.Query<dynamic>("Test_UpdateSong", song, commandType: CommandType.StoredProcedure);
}
dbConn.Close();
Который также работает. Но как теперь получить мои выходные параметры?