[seasar-dotnet:1744] Re: [DBFlute.NET]OutsideSqlにて不適切な構文がありますのエラー

kubo [E-MAIL ADDRESS DELETED]
2010年 6月 19日 (土) 13:55:01 JST


久保(jflute)です。

uparrowさん、こんにちは

添付のSQLですが、さらに実際に実行されたSQLに
着目すると原因が掴みやすいです。
(IFコメントなどの分岐が処理された後のSQL)
恐らく、2Way-SQLとしては正常で、パラメータコメントが
処理されたことで逆にSQLとして間違ったものになって
しまっているのではないかと思われます。

DENPYO_DATE の条件が特にIFコメントで囲われて
いないのですが、この条件は固定と考えてOKでしょうか?
であれば、業務的にwhere句が消えることはないということで、
BEGINコメントを利用する必要はないかと思われます。
(この状況でBEGINを使うと、SOUKO_CDの前の
and が消えてしまうのではないかと)

// BEGINコメント
http://dbflute.sandbox.seasar.org/ja/manual/function/ormapper/outsidesql/pmcomment.html#begincomment

DBFlute.NETだと、S2Dao.NETの仕様なので、
厳密には同じではありませんが、基本仕様は同じ
なので参考にして下さい。

2010/6/19  <[E-MAIL ADDRESS DELETED]>:
> お世話になっております、uparrowです。
>
> 大変便利にDBFluteを利用させていただいております。
> 複雑なSQLを発行したく、初めてOutsideSqlに挑戦しております。
>
> OutsideSqlを用いでデータの取得を行いたいのですが、
> 原因がわからない実行時エラーが出て困っております。
>
>            String path = TZaikoDataBhv.PATH_selectCurrentZaiko;
>            CurrentZaikoPmb pmb = new CurrentZaikoPmb();
>            pmb.LatestMonthryTanaDate = "20091231";
>            pmb.BasisDate = "20100218";
>            pmb.FrHinmokuCd = null;
>            pmb.ToHinmokuCd = null;
>            pmb.FrSoukoCd = "0001";
>            pmb.ToSoukoCd = "0001";
>            IList<CurrentZaiko>      curZaikoList = tZaikoDataBhv.OutsideSql().SelectList<CurrentZaiko>(path, pmb);
>
> このようにして外出しSQLを実行したのですが、
> SelectListのところでExceptionが発生します。
> 使用しているSQLのファイルは添付したものとなります。
> (実際はもっと複雑なSQLなのですが、原因と思われる部分に着目し一部を切り出しました。)
>
> ex.Messageには次のようなメッセージが設定されておりました。
>
> ==== ここから ====
> Look! Read the message below.
> /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
> The SQL failed to execute!
>
> [Advice]
> Please confirm the Exception message.
>
> [Exception]
> Seasar.Framework.Exceptions.SQLRuntimeException
> [ESSR0071]SQLException occured, because System.Data.SqlClient.SqlException: 'SOUKO_CD' 付近に不適切な構文があります。
>   場所 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
>   場所 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
>   場所 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
>   場所 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
>   場所 System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
>   場所 System.Data.SqlClient.SqlDataReader.get_MetaData()
>   場所 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
>   場所 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
>   場所 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
>   場所 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
>   場所 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
>   場所 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
>   場所 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
>   場所 Seasar.Framework.Util.CommandUtil.ExecuteReader(IDataSource dataSource, IDbCommand cmd)
>
> [NextException]
> System.Data.SqlClient.SqlException
> 'SOUKO_CD' 付近に不適切な構文があります。
>  ErrorCode = -2146232060
>  HelpLink  =
> ==== ここまで ====
>
> なお、
>            pmb.FrSoukoCd = null;
>            pmb.ToSoukoCd = null;
> とすると、例外が発生せず、データの取得は成功します。
> 条件句の部分が問題なのかもしれませんが、具体的に何が間違っているのかわからない状態です。
> サンプルを参考に、/*IF*/ を利用したつもりなのですが。。。
>
> なにか、方法に誤りがあるのでしょうか?
> または、問題となっている箇所がわかる方法はございますでしょうか?
>
> このSQLを発行すると問題なくデータが取得できますし、
> outside-sql-test.batも成功しました。
>
> 使用しているDBFluteはdbflute-0.8.9.9となります。
>
> 以上、よろしくお願いいたします。
> --
> <[E-MAIL ADDRESS DELETED]>
>
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
>


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