Stored procedures ibatis datamapper使用一些默认参数为存储过程编写脚本

Stored procedures ibatis datamapper使用一些默认参数为存储过程编写脚本,stored-procedures,datamapper,ibatis.net,Stored Procedures,Datamapper,Ibatis.net,如果目标存储过程添加了一些参数,但实际上使用了默认值,那么如何用xml生成健壮的datamapper脚本 比如说,, 我设计了一个带有如下默认参数的存储过程 CREATE PROCEDURE [dbo].[SP_Test_1] @mode int = 1 -- skippable AS RETURN 1 <procedure id="myDBService.exeSPTest1"> SP_Test_1 </procedure> [ArgumentOu

如果目标存储过程添加了一些参数,但实际上使用了默认值,那么如何用xml生成健壮的datamapper脚本

比如说,, 我设计了一个带有如下默认参数的存储过程

CREATE PROCEDURE [dbo].[SP_Test_1]
    @mode int = 1 -- skippable
AS
RETURN 1
<procedure id="myDBService.exeSPTest1">
    SP_Test_1
</procedure> 
[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
CREATE PROCEDURE [dbo].[SP_Test_1]
    @mode int = 1, -- skippable
    @reserved int = 1 -- used in the future, still skippable
AS
RETURN 1
MyBatis datamapper的xml格式如下:

CREATE PROCEDURE [dbo].[SP_Test_1]
    @mode int = 1 -- skippable
AS
RETURN 1
<procedure id="myDBService.exeSPTest1">
    SP_Test_1
</procedure> 
[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
CREATE PROCEDURE [dbo].[SP_Test_1]
    @mode int = 1, -- skippable
    @reserved int = 1 -- used in the future, still skippable
AS
RETURN 1
直到我给了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);
关键是,如果在存储过程中添加可跳过的参数,则不要更改前端层代码或xml设置。任何想法都将不胜感激。
谢谢你。

我想我从你那里得到了一个主意

比如说,

<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>

//EXEC SP_Test_1@mode=#mode#
//或
//执行SP_测试_1
//如你所愿
现在,它可以使用具有任意数量默认参数的SP