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

koyak koyak_home @ y7.dion.ne.jp
2007年 3月 3日 (土) 00:37:42 JST


小谷です。

見当違いのことを言ってしまっていましたら
お許し下さい。

使用されている
"^\s*(\-?\b*[_a-zA-Z.']+[_a-zA-Z0-9\[()\]]*)"
という正規表現は、
SQLコメントの中から
「引数名.プロパティ名orメソッド」を
取り出すためのものなのではないかと思います。

引数名に数値が混ざっている場合、上記正規表現だと
[_a-zA-Z.']+の部分は数値とマッチしません。
そのため、
par1amなら「par」が[_a-zA-Z.']+で一致し、
「1am」がその後の[_a-zA-Z0-9\[()\]]*で一致します。
この後に.HasValueがきた場合、「.」が[_a-zA-Z0-9\[()\]]に
含まれないため(終端を.で終わらせないため?)、
par1amと.HasValueが別トークンとして扱われることに
なるのではないでしょうか。

正規表現を
"^\s*(\-?\b*[_a-zA-Z0-9.']+[_a-zA-Z0-9\[()\]]*)"
として試しに以下のプログラムを動かしてみたところ
「.」以降の部分も同じトークンで扱われるようです。

Regex reSym =
	new Regex(@"^\s*(\-?\b*[_a-zA-Z0-9.']+[_a-zA-Z0-9\[()\]]*)", 	
RegexOptions.Compiled);

	string target = "par1am.HasValue";
	Match mch = reSym.Match(target);
        Console.WriteLine(mch.Groups[1].Value);

        string target2 = "a1i2u3e4o.Length == 1";
        Match mch2 = reSym.Match(target2);
        Console.WriteLine(mch2.Groups[1].Value);

        Console.ReadLine();


> 杉本です。
> 
> 西方さん、すいません。反応が遅くなりました。
> # いろいろとスタートするものがありまして・・
> 
> 調査してみます。
> 
> # が、正規表現は苦手なのでコミッタの方々助けてください・・orz
> 
> 07/02/27 に Akira Nishikata さんは書きました:
> 
>>お世話になっております。西方と申します。
>>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 mailing list
>>seasar-dotnet @ ml.seasar.org
>>https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
> 
> 
> 



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