【问题标题】:Using Dapper to return XML string from T-SQL stored procedures使用 Dapper 从 T-SQL 存储过程返回 XML 字符串
【发布时间】:2017-08-24 22:53:13
【问题描述】:

我正在开发一个将大型 VB6 应用程序转换为 .NET 的项目。我决定创建一个项目来为现有的 VB6 ADO 代码提供外观,在这里我使用令人惊叹的 Dapper 扩展方法来处理 VB6 ADO 函数曾经执行的所有数据库代码。

我在新项目中必须支持的功能之一是能够从 T-SQL 存储过程(通过 FOR XML)获取 XML 字符串结果。 Dapper 不支持返回我可以看到的这个 XML。因此,我实现了 ADO.NET ExecuteXmlReader 方法来提供此返回。我的项目还使用 Dapper DynamicParameters 来捕获存储过程所需的所有输入/输出参数。

我不知道该怎么做,是如何将DynamicParameters 转换为SqlCommand.SqlParameterCollection,以便我可以将这些参数填充到SqlCommand 对象的ExecuteXmlReader 方法中。对于这种情况,我也必须支持输出参数。

我可以遍历DynamicParameters,但这只会让我得到参数名称和值。我还需要方向、类型、大小、比例和精度。 Dapper 有一个 DynamicParameters.ReplaceLiterals 方法,它接受一个 IDbCommand 对象来替换 SQL 字符串中的文字。我希望它有一种方法也可以填写参数。

我在这里遗漏了一些明显的东西吗?如果我调用 Dapper Execute 方法,我可以将 DyanmicParameters 直接传递到此方法中。我只是没有看到如何将它们传递给 SqlCommand 对象。

【问题讨论】:

    标签: c# xml ado.net dapper


    【解决方案1】:

    经过测试,我发现 Dapper 确实支持从存储过程中提取 XML。

    var result = conn.Query<string>(@"select * from <someTable> for xml auto");
    

    这将返回一个字符串数组,其中每个元素最多包含 2,033 个字符,您可以简单地将其连接以将结果作为单个字符串。

    var fullResult = string.Join("", result);
    

    var fullResult = string.Concat(result);
    

    或者,一步到位:

    var result = string.Concat(conn.Query<string>(
        @"select * from <someTable> for xml auto", buffered: false));
    

    所以,不需要我自己实现ExcuteXmlReader方法,现在我可以让Dapper正常处理参数了。

    【讨论】:

    • @Marc 为什么它首先被吐成块? (IEnumerable&lt;string&gt;) ,强制使用concat
    猜你喜欢
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多