[seasar-dotnet:467] 数字を含む引数をDaoのメソッドに渡すとJScriptEvaluateRuntimeExceptionが発生する

Akira Nishikata nishikata.a @ buildsystem.jp
2007年 2月 27日 (火) 17:13:39 JST


お世話になっております。西方と申します。
S2Container.NET 1.2.8.0
S2Dao.NET 1.0.3.0
を使用しています。

現在、Daoインターフェースに以下のようなメソッドを定義しています。
--------------------------------------------------------------------------------
[Seasar.Dao.Attrs.Sql("select * from shop_OrderDetail /*BEGIN*/ where /*IF par1am.HasValue*/ order_detail_id = 1 /*END*/ /*END*/")]
IList SelectListByIncludeNumberParam(Nullables.NullableDecimal par1am);
--------------------------------------------------------------------------------

ここで上記メソッドを呼び出すとJScript.NETから下記のような例外が帰ってきます。
--------------------------------------------------------------------------------
Seasar.Framework.Exceptions.JScriptEvaluateRuntimeException: [ESSR0073]JScriptException occured, because self.GetArg('par1am') self.GetArg('.HasValue')

場所 Seasar.Framework.Util.JScriptUtil.Evaluate(String exp, Hashtable ctx, Object root) 
場所 Seasar.Dao.Node.AbstractNode.InvokeExpression(String expression, ICommandContext ctx) 
場所 Seasar.Dao.Node.IfNode.Accept(ICommandContext ctx) 
場所 Seasar.Dao.Node.ContainerNode.Accept(ICommandContext ctx) 
場所 Seasar.Dao.Node.BeginNode.Accept(ICommandContext ctx) 
場所 Seasar.Dao.Node.ContainerNode.Accept(ICommandContext ctx) 
場所 Seasar.Dao.Impl.SelectDynamicCommand.Execute(Object[] args) 
場所 XXX.Dao.Allcommon.s2dao.S2DaoInterceptor.Invoke(IMethodInvocation invocation) 場所 S2DaoInterceptor.cs:行 107 
場所 Seasar.Framework.Aop.Proxy.AopProxy.Invoke(IMessage msg) 
場所 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
場所 XXX.Dao.Exdao.ShopOrderDetailDao.SelectListByIncludeNumberParam(NullableDecimal par1am) 
場所 XXXTest.S2Dao.QueryAnnotationTest.SelectListByNumberIncludeParamTest() 場所 QueryAnnotationTest.cs:行 35 

System.Reflection.TargetInvocationException: 呼び出しのターゲットが例外をスローしました。

場所 System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 
場所 System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 
場所 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
場所 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
場所 System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) 
場所 Seasar.Framework.Util.JScriptUtil.Evaluate(String exp, Hashtable ctx, Object root) 

Microsoft.JScript.JScriptException: ';' が必要です。

eval code: 行 1 - エラー: ';' が必要です。 
--------------------------------------------------------------------------------

どうやらDaoインターフェースの引数か、テーブル名に数字が含まれている場合、上記の例外が発生するようです。

問題の箇所は、Seasar.Dao.Node.ExpressionUtilの
--------------------------------------------------------------------------------
 reSym = new Regex(@"^\s*(\-?\b*[_a-zA-Z.']+[_a-zA-Z0-9\[()\]]*)", RegexOptions.Compiled);
--------------------------------------------------------------------------------
の正規表現部分だと思うのですが、、

以上よろしくお願いいたします。

-----------------------------------------
株式会社ビルドシステム 業務システム開発部

西方 彬 <nishikata.a @ buildsystem.jp>
-----------------------------------------


seasar-dotnet メーリングリストの案内