在 PetaPoco 中调用带参数的存储过程

Posted

技术标签:

【中文标题】在 PetaPoco 中调用带参数的存储过程【英文标题】:Calling stored procedures with parameters in PetaPoco 【发布时间】:2011-10-20 11:52:30 【问题描述】:

我希望能够在 PetaPoco 中调用带有命名参数的存储过程。

为了调用执行搜索/获取的存储过程:

我可以这样做吗:

return db.Fetch<Customer>("EXEC SP_FindCust",
new SqlParameter("@first_name", fName),
new SqlParameter("@last_name", lName),
new SqlParameter("@dob", dob));

另外,如何调用执行插入操作的存储过程?

return db.Execute("EXEC InsertCust @CustID = 1, @CustName = AAA")

谢谢, 纳克

【问题讨论】:

我必须设置 EnableAutoSelect = false。否则 petapoco 一直试图在我的 EXEC 中添加一个 select 子句 如果您在 EXEC PetaPoco 之前添加 ; 将不会添加 SELECT:.Execute(";EXEC InsertCust @C 添加分号有点像自己做 SQL 注入。我认为db.EnableAutoSelect = false 是更清洁的解决方案。 【参考方案1】:

更新:

我尝试了以下获取和插入的方法,效果很好:

var s = PetaPoco.Sql.Builder.Append("EXEC SP_FindCust @@last_name = @0", lname);
s.Append(", @@first_name = @0", fName);
s.Append(", @@last_name = @0", lName);
s.Append(", @@dob = @0", dob);
return db.Query<Cust>(s);

这可以进一步改进以传递 SQL 参数。

【讨论】:

您好,非常感谢,但是您知道如何从插入中返回身份吗?我的存储过程是 INSERT INTO t_Book VALUES(@BookName, @ParentBookId) SELECT @BookId = SCOPE_IDENTITY() 就是这样:使用双 @ 作为存储过程参数,使用单 @ 作为 petapoco 参数就可以了。谢谢。【参考方案2】:

从 v6.0.344-beta 开始,PetaPoco 现在支持存储过程,无需使用 EXEC。见https://github.com/CollaboratingPlatypus/PetaPoco/wiki/Stored-procedures

【讨论】:

【参考方案3】:

就我而言,我做了以下操作

db.EnableAutoSelect = false;

return db.Fetch<Customer>(@"EXEC SP_FindCust 
@@first_name = @first_name, 
@@last_name = @last_name, 
@@dob = @dob", new 
  first_name = fName,
  last_name = lName,
  dob = dob
);

成功了!

【讨论】:

以上是关于在 PetaPoco 中调用带参数的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

带类型参数的 PetaPoco 查询

使用 PetaPoco 将表值参数传递给存储过程

PetaPoco 和存储过程的输出参数?

在c#中调用带参数的存储过程

sql数据库中怎样调用带参数的存储过程

怎样在Delphi中实现在运行中实现带参数的存储过程?