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

Mor*_*lan 3 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对象中ExecuteXmlReader.我还必须支持此方案的输出参数.

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

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

Mor*_*lan 6

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

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

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

var fullResult = string.Join("", result);
Run Code Online (Sandbox Code Playgroud)

要么

var fullResult = string.Concat(result);
Run Code Online (Sandbox Code Playgroud)

或者,一步到位:

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

因此,我不需要自己实现ExcuteXmlReader方法,现在我可以让Dapper正常处理参数.