使用ORMLite和输出参数的ServiceStack MARS(多个活动结果集)

Ram*_*gid 7 stored-procedures sql-server-mars servicestack dapper ormlite-servicestack

ServiceStack ORMLite很棒,我通常避免使用ORM心态,而是更喜欢构建数据库,因为构建数据库而不是1:1类模型是有意义的.也就是说,有几件事我似乎遇到了困难,我确信这只是我无知的光芒.

第一:

有没有办法使用ORMLite管理多个结果集?我知道可以使用Dapper使用QueryMultiple方法,但无论出于何种原因,我都有时间搞清楚如何使用ServiceStack的内置Dapper实现.

第二:

有没有办法使用ORMLite在存储过程调用中返回输出参数?

理想情况下,我想避开MARS和输出参数,理想情况下我想生活在一个理想的世界:)

我正在使用.NET framework 4.5,SQL Server 2008 R2和ServiceStack 3.9.46.

Ram*_*gid 11

事实证明,这非常简单(只要你知道实现它的魔力).

基于文档和一个看似误导性的帖子表明Dapper被"包含"在剃刀中我假设当暗示Dapper是"内置"时它基本上是包含的库的一部分.

如果你愿意,请笑,但对于我们这些没有开悟的人,我将概述如何让Dapper扩展出现.所以这就是魔术.

使用程序包管理器控制台执行以下操作:

Install-Package ServiceStack
Install-Package Dapper
Run Code Online (Sandbox Code Playgroud)

将以下using语句(C#)添加到您的服务:

using ServiceStack.OrmLite;
using Dapper;
Run Code Online (Sandbox Code Playgroud)

现在,当您利用Db对象时,所有OrmLite和Dapper方法都将存在.

要获得输出参数,现在就像这样简单:

var p = new DynamicParameters();

p.Add("@param1", request.stuff1);
p.Add("@param2", request.stuff2);
p.Add("@param3", dbType: DbType.Int32, direction: ParameterDirection.Output);

Db.Execute("schema.sp_stored_proc_name", p, commandType: CommandType.StoredProcedure);

response.outputStuff = p.Get<int>("@param3");
Run Code Online (Sandbox Code Playgroud)

为了管理MARS(假设你有一个返回两个结果集和一个输出参数的SP):

p.Add("@param1", request.stuff1);
p.Add("@param2", request.stuff2);
p.Add("@param3", dbType: DbType.Int32, direction: ParameterDirection.Output);

var mars = Db.QueryMultiple("schema.sp_stored_proc_name", p, commandType: CommandType.StoredProcedure);

//firstSet contains the first result set
var firstSet = mars.Read().ToList();
//secondSet contains the second result set
var secondSet = mars.Read().ToList();

response.outputStuff = p.Get<int>("param3");
Run Code Online (Sandbox Code Playgroud)

一旦你知道了魔法,它就非常简单:)

这是一个更复杂的例子.

希望这有助于其他人出去并节省一些时间.