0

如果目标存储过程添加了一些参数但确实具有默认值,我如何在 xml 中制作强大的数据映射器脚本?

例如,我设计了一个带有一些默认参数的存储过程,如下所示,

CREATE PROCEDURE [dbo].[SP_Test_1]
    @mode int = 1 -- skippable
AS
RETURN 1

像这样的 xml 中的 MyBatis 数据映射器,

<procedure id="myDBService.exeSPTest1">
    SP_Test_1
</procedure> 

我称这个声明的方式,

IList<myStruct> list = myDataSource.QueryForList<myStruct>("myDBService.exeSPTest1", null);

但总是出现这样的错误,

[ArgumentOutOfRangeException: index]
   IBatisNet.DataMapper.Configuration.ParameterMapping.ParameterPropertyCollection.get_Item(Int32 index) +88
   IBatisNet.DataMapper.Configuration.ParameterMapping.ParameterMap.GetProperty(Int32 index) +76
   IBatisNet.DataMapper.Commands.DefaultPreparedCommand.ApplyParameterMap(ISqlMapSession session, IDbCommand command, RequestScope request, IStatement statement, Object parameterObject) +395
   IBatisNet.DataMapper.Commands.DefaultPreparedCommand.Create(RequestScope request, ISqlMapSession session, IStatement statement, Object parameterObject) +439
   IBatisNet.DataMapper.MappedStatements.MappedStatement.ExecuteQueryForList(ISqlMapSession session, Object parameterObject) +125
   IBatisNet.DataMapper.SqlMapper.QueryForList(String statementName, Object parameterObject) +251

直到我给了一个 parameterMap 标签然后工作,

<procedure id="myDBService.exeSPTest1" parameterMap="myDBService.params-exeSPTest1">
    SP_Test_1
</procedure> 

<parameterMap id="myDBService.params-exeSPTest1" class="Hashtable">
  <parameter column="mode" property="mode" dbType="int" type="int" />
</parameterMap>

Hashtable ht = new Hashtable();
ht.Add("mode", 1);
IList<myStruct> list = myDataSource.QueryForList<myStruct>("myDBService.exeSPTest1", ht);

虽然它后来起作用了,但我实际上希望通过大量过程调用输入灵活的参数。例如,在同一个程序中,我可以在不改变任何前端代码的情况下使其具有多个参数,像这样,

CREATE PROCEDURE [dbo].[SP_Test_1]
    @mode int = 1, -- skippable
    @reserved int = 1 -- used in the future, still skippable
AS
RETURN 1

如果我在存储过程中添加可跳过的参数,关键是不要更改前端代码或 xml 设置。任何想法将不胜感激。谢谢你。

4

1 回答 1

0

我想我从这个页面得到了一个想法。

例如,

<statement id="myDBService.exeSPTest1" parameterClass="myDBService.params-exeSPTest1" >  
 <dynamic>  
  // EXEC SP_Test_1 @mode = #mode#
  // or
  // EXEC SP_Test_1
  // as ur wish
 </dynamic>  
</statement>

现在,它可以与具有任意数量默认参数的 SP 一起使用。

于 2013-11-21T03:44:31.310 回答