存储过程框架现在支持多个记录集中的动态字段





5.00/5 (5投票s)
存储过程框架现在支持多个记录集中的动态字段
存储过程框架的最新更新是一个“紧急增强”,是根据框架消费者的要求添加了动态字段支持。 最初的修复程序(v1.0.2) 不允许在多个记录集中使用动态字段,而仅在单个记录集中使用。 现在已经重新设计,成为一个完整的修复程序,允许返回具有“未知”动态字段的存储过程。 下面展示了如何实现此功能的示例。
例如,下面的存储过程有三个记录集。 让我们以预定义的字段模式为例,并假设这些字段在每次调用存储过程时都可能不同,具体取决于一组虚构的参数。 例如,也许实际的存储过程会将记录透视到字段名称,或者类似的操作。
CREATE PROCEDURE [dbo].[MultipleRecordSetDynamicColumnStoredProcedure]
AS
BEGIN
/* First Record Set */
SELECT 'Dave' [Firstname],
'Smith' [Surname],
32 [Age],
GETDATE() [DateOfBirth]
UNION
SELECT 'Peter' [Firstname],
'Pan' [Surname],
134 [Age],
GETDATE() [DateOfBirth];
/* Second Record Set */
SELECT
CAST(1 AS BIT) AS [Active]
, CAST(10.99 AS MONEY) AS [Price];
/* Third Record Set */
SELECT
NEWID() AS [UniqueIdentifier]
, 1 AS [Count];
END
现在我们需要一个 C# 类来表示存储过程 'MultipleRecordSetDynamicColumnStoredProcedure
'。 由于此“示例”存储过程没有参数,我们将从框架的 'NoParametersStoredProcedureBase
' 继承,但使用类内部的 'ResultSet
' 类作为返回类型。 您可以看到 'ResultSet
' 类有三个 .NET dynamic ExpandoObject
的列表。 这些在 'ResultSet
' 类的构造函数中实例化。 这些列表中的每一个都代表存储过程将返回的一个 记录集
。 记录集
中的每一行都表示为一个 ExpandoObject
,因为我们不知道字段是什么。 如果我们知道,我们只需设置一个预定义的类,其中包含代表字段的属性即可。
internal class MultipleRecordSetDynamicColumnStoredProcedure
: NoParametersStoredProcedureBase<
MultipleRecordSetDynamicColumnStoredProcedure.ResultSet>
{
internal class ResultSet
{
public List<ExpandoObject> RecordSet1 { get; private set; }
public List<ExpandoObject> RecordSet2 { get; private set; }
public List<ExpandoObject> RecordSet3 { get; private set; }
public ResultSet()
{
RecordSet1 = new List<ExpandoObject>();
RecordSet2 = new List<ExpandoObject>();
RecordSet3 = new List<ExpandoObject>();
}
}
}
现在我们可以使用类似于下面的单元测试的代码来调用 'MultipleRecordSetDynamicColumnStoredProcedure
'。
[TestMethod]
public void MultipleRecordSetStoredDynamiccolumProcedure_WithThreeSelects_ReturnsCorrectDataValues()
{
// ARRANGE
var procedure = new MultipleRecordSetDynamicColumnStoredProcedure();
// ACT
var resultSet = Connection.ExecuteStoredProcedure(procedure);
var results1 = resultSet.RecordSet1;
var result1 = results1.First() as dynamic;
var results2 = resultSet.RecordSet2;
var result2 = results2.First() as dynamic;
var results3 = resultSet.RecordSet3;
var result3 = results3.First() as dynamic;
// ASSERT
Assert.IsNotNull(result1);
Assert.AreEqual("Dave", result1.Firstname);
Assert.AreEqual("Smith", result1.Surname);
Assert.AreEqual(32, result1.Age);
Assert.IsNotNull(result2);
Assert.AreEqual(true, result2.Active);
Assert.AreEqual(10.99, Math.Round(((double)result2.Price), 2));
Assert.IsNotNull(result3);
Assert.AreEqual(1, result3.Count);
}
正如我们在测试示例中所看到的,我们知道期望的列是什么,但如果您要返回一些动态数据以转换为 JSON,或者您正在使用的通用报告框架可以将数据很好地转换为动态表,您可能希望使用此功能。
希望其他人现在能够利用存储过程框架中的这些新功能。
GitHub 源代码
文档和源代码可以在 GitHub 上找到 [这里]。
NuGet包
存储过程框架也可在 NuGet 上获得 (https://nuget.net.cn/packages/Dibware.StoredProcedureFramework/),及其 EF 对应版本 (https://nuget.net.cn/packages/Dibware.StoredProcedureFrameworkForEF/)。
免责声明
我是存储过程框架的作者。