gpt4 book ai didi

dapper - 从存储过程获取输出参数的替代方法

转载 作者:行者123 更新时间:2023-12-04 09:18:09 24 4
gpt4 key购买 nike

我喜欢使用 Dapper 来满足我的 ORM 需求,但我知道必须有更好的方法来使用存储过程和强类型列表插入/更新我的 sql server 数据库。

例如:

我有一个类:

    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();

这也有效。但是,现在我如何获得我的输出参数?

最佳答案

正如我最初所说,我不想手动将每个类属性转换为 Dapper 动态参数。这很关键,因为如果我创建一个泛型方法,我可能不知道将哪个类传递给该方法,因此不知道要传递哪些属性以转换为动态参数。接受@Metro Smurfs 的建议(当所有其他方法都失败时,请阅读说明),我查看了 Dapper 测试类并找到了一个对我有用的解决方案:

DynamicParameters p = new DynamicParameters(song);

通过将歌曲对象添加到 DynamicParameters 构造函数,将创建一个 DynamicParameters 模板,该模板将自动将所有属性转换为参数。然后我可以简单地添加我的两个输出参数并执行 sproc:
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);
// get my output parameters...
var success_added = p.Get<bool>("@success_Added");
var success_added = p.Get<bool>("@success_Updated");

我可以走了!感谢@Nick 和@Metro Smurf 的建议!

关于dapper - 从存储过程获取输出参数的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28652987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com