我正在开发一个将大型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
对象。
答案 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正常处理参数。