使用Dapper从T-SQL存储过程返回XML字符串

时间:2017-03-30 20:19:52

标签: c# xml ado.net dapper

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

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

我看不到该怎么做,是如何将DynamicParameters转换为SqlCommand.SqlParameterCollection,以便我可以将这些参数填充到SqlCommand对象中{{1} }} 方法。我还必须支持此方案的输出参数。

我可以迭代ExecuteXmlReader,但这只能获取参数名称和值。我还需要方向,类型,大小,比例和精度。 Dapper有一个DynamicParameters方法,它使用DynamicParameters.ReplaceLiterals对象替换SQL字符串中的文字。我希望它有一个方法来填写参数。

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

1 个答案:

答案 0 :(得分:6)

经过测试,我发现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正常处理参数。