65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2016 年 8 月 1 日

CPOL

2分钟阅读

viewsIcon

15329

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

存储过程框架的最新更新是一个“紧急增强”,是根据框架消费者的要求添加了动态字段支持。 最初的修复程序(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/)。

免责声明

我是存储过程框架的作者。

© . All rights reserved.