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 に答える