[seasar-dotnet:1908] Re: 自動発行SQLのテーブル名にクォート

井上忠彦 [E-MAIL ADDRESS DELETED]
2011年 1月 14日 (金) 19:56:48 JST


久保様

> 古いバージョンのログのような気がしますね。
失礼いたしました。私のログ保管間違いかもしれません。

> 反映しました。SNAPSHOTが上書きされています。
ありがとうございます。

テーブル名・カラム名ともに、$$ALL$$指定にて確認させていただきました。
以下、日本語・アルファベットともに違いはありません。

TableSqlName,getTableSqlName(),EntityのTable属性すべてクォートされています。

ただその後、selectで下記エラーとなります。
S2Dao側RowCreatorImpl.CreateColumnMetaData()内のFindColumnName()にてカラ
ム名が取得できないところが起因となっているようです。

たびたび申し訳ございませんが、ご確認をお願いできますでしょうか?

--- ここから
The SQL failed to execute!
[Advice]
Please confirm the Exception message.
[Exception]
Core.DBFlute.AllCommon.JavaLike.IllegalStateException
The propertyCache should not be empty: bean=Tblcontrol
[Behavior]
TblcontrolBhv.SelectEntity()
[ConditionBean]
Core.DBFlute.CBean.TblcontrolCB
[Statement]
Oracle.DataAccess.Client.OracleCommand
[Display SQL]
select  dfloc."COLKEY" as c0, dfloc."COLNAME" as c1
  from "TBLCONTROL" dfloc
 where dfloc.COLKEY = 5

 Core.DBFlute.AllCommon.JavaLike.IllegalStateException: The
propertyCache should not be empty: bean=Tblcontrol
   場所
Core.DBFlute.AllCommon.S2Dao.InternalRowCreator.CreateRow(IDataReader
reader, IColumnMetaData[] columns, Type beanType)
   場所
Core.DBFlute.AllCommon.S2Dao.Internal.RsHandler.InternalAbstractBeanMetaDataResultSetHandler.CreateRow(IDataReader
reader, IColumnMetaData[] columns)
   場所
Core.DBFlute.AllCommon.S2Dao.Internal.RsHandler.InternalBeanListMetaDataResultSetHandler.Handle(IDataReader
dataReader, IList list)
   場所
Core.DBFlute.AllCommon.S2Dao.Internal.RsHandler.InternalBeanGenericListMetaDataResultSetHandler.Handle(IDataReader
dataReader)
   場所
Core.DBFlute.AllCommon.S2Dao.Internal.SqlHandler.InternalBasicSelectHandler.Execute(IDbCommand
cmd, Object[] args)
--- ここまで


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

(11/01/13 (木) 23:48), kubo wrote:
> 久保です。
> 
>> 以下のとおりです。
>>
>> --- 8.9.23-SNAPSHOT ここから
>> 2011-01-12 22:40:15,235 [main] INFO
>> (TorqueJDBCTransformTask#generateXML():267) - $ MY.TBLCONTROL(TABLE)
>> 2011-01-12 22:40:15,391 [main] INFO
>> (TorqueJDBCTransformTask#generateXML():267) - $ MY.コントロール(TABLE)
>> 2011-01-12 22:40:15,437 [main] WARN
>> (TorqueJDBCTransformTask#generateXML():365) - Failed to get unique
>> column information! But continue...
>> java.sql.SQLException: コールに無効な引数があります。
>> --- 8.9.23-SNAPSHOT ここまで
> 
> 古いバージョンのログのような気がしますね。
> generateXML():365 では、そのようなログは出してないし、
> 「Failed to get unique column information! But continue...」
> という文言自体、最新のソースではもうどこにもありません。
> 
>>> $$ALL$$ って指定すると「全てのテーブルに付与する」って
>>> いう機能をこれから実装しようかなと思ってました。
>>
>> ありがとうございます。非常に助かります。
>> 期待して待たせていただきます。
> 
> 反映しました。SNAPSHOTが上書きされています。
> dfpropのドキュメントも更新しています。
> 
> 
> #
> # JDBCドライバで、DatabaseMetaData.needsQuote(name)
> # みたいなメソッドがあったらいいのにって思いますよね...
> # (そしたら、必要な名前にだけ自動でクォートってなことが)
> #
> 
> 2011/1/13 井上忠彦<[E-MAIL ADDRESS DELETED]>:
>> 久保様
>>
>> ご回答ありがとうございます。
>>
>>> このWARNのログって、どんなログですか?
>> 以下のとおりです。
>>
>> --- 8.9.23-SNAPSHOT ここから
>> 2011-01-12 22:40:15,235 [main] INFO
>> (TorqueJDBCTransformTask#generateXML():267) - $ MY.TBLCONTROL(TABLE)
>> 2011-01-12 22:40:15,391 [main] INFO
>> (TorqueJDBCTransformTask#generateXML():267) - $ MY.コントロール(TABLE)
>> 2011-01-12 22:40:15,437 [main] WARN
>> (TorqueJDBCTransformTask#generateXML():365) - Failed to get unique
>> column information! But continue...
>> java.sql.SQLException: コールに無効な引数があります。
>> --- 8.9.23-SNAPSHOT ここまで
>>
>>> 確認ですが、dfprop のエンコーディングは合っていますか?
>> 大変失礼いたしました。SJISでした。
>> UTF-8に修正したところ、WARNもERRORも発生しなくなりました。
>>
>> dfpropのエンコードを修正し、8.9.23-SNAPSHOTでの確認結果です。
>>
>> テーブル名がアルファベットの場合、
>> TableSqlname →○
>> getTableSqlName() →○
>> EntityのTable属性 →○
>>
>> テーブル名が日本語の場合、
>> TableSqlname →○
>> getTableSqlName() →○
>> EntityのTable属性 →○
>>
>> と言うわけで、こちらはdfpropのエンコードが原因だったようです。
>> ありがとうございます。引き続きその他確認をしてみます。
>>
>>> $$ALL$$ って指定すると「全てのテーブルに付与する」って
>>> いう機能をこれから実装しようかなと思ってました。
>>
>> ありがとうございます。非常に助かります。
>> 期待して待たせていただきます。
>>
>> 以上、よろしくお願いいたします。
>>
>> 井上
>>
>> (11/01/13 (木) 18:14), kubo wrote:
>>> 久保です。
>>>
>>> 井上さん、ご確認ありがとうございます。
>>>
>>>>> dbflute-0.8.9.23-SNAPSHOT.zip
>>>> こちらで実行したところ、エラーは回避されました。
>>>> WARNのログ出力となり、schema.xmlが出力されることが確認できました。
>>>
>>> このWARNのログって、どんなログですか?
>>> 今回の修正では、例外時に「クォートして再実行」としている
>>> だけなので、今回の現象に関するWARNログは出力していない
>>> はずなのですが。
>>>
>>>>> (ユニーク制約とインデックス情報ちゃんと取れるかな...!?)
>>>> 申し訳ございませんが、現状ここまでの確認はできておりません。
>>>
>>> まあ、後で Doc タスクの SchemaHTML を見て頂ければと。
>>> (ユニーク制約やインデックスを使ったテーブルで試したときに)
>>>
>>>> テーブル名が日本語の場合、
>>>> TableSqlName →×
>>>> getTableSqlName() →×
>>>
>>> 日本語だと x っていうのが変ですね。
>>> 確認ですが、dfprop のエンコーディングは合っていますか?
>>> http://dbflute.sandbox.seasar.org/ja/manual/reference/dfprop/about.html#propspec
>>> (dfprop は UTF-8 です。例えば、Shift_JIS だとプログラム内部で
>>> 文字化けしてしまった文字列を判定に使ってしまうかも...!?)
>>>
>>>>> (あと、DaoインターフェースのBean属性の値)
>>>> こちらは、BsDao以下にあるクラスでよろしいのでしょうか?
>>>> 見たところここのクラスには文字列の記載がありませんでした。
>>>
>>> ごめんなさい。完全に間違えてました。
>>> Daoインターフェースじゃなくて Entity です。
>>> Seasar.Dao.Attrs.Table 属性が定義されているはずです。
>>>
>>>> 上記の方法でうまくいったとしましても、
>>>> テーブルが300近くあり、まだ機能変更・追加も頻繁に行われている状況で、
>>>> 現実的に難しいと考えています。
>>>> お手数ですが、他に何かよいアイデアあればご教授いただけませんでしょうか?
>>>
>>> まあ、そんなところじゃないかと思っていたので、
>>> $$ALL$$ って指定すると「全てのテーブルに付与する」って
>>> いう機能をこれから実装しようかなと思ってました。
>>> これは、ちょっとお待ち下さい(今帰って来たばかりで...)。
>>>
>>> 2011/1/13 井上忠彦<[E-MAIL ADDRESS DELETED]>:
>>>> 久保様
>>>>
>>>> 早急なご回答ありがとうございます。
>>>>
>>>>> dbflute-0.8.9.23-SNAPSHOT.zip
>>>> こちらで実行したところ、エラーは回避されました。
>>>> WARNのログ出力となり、schema.xmlが出力されることが確認できました。
>>>> generate.batもエラーなく動作しました。
>>>>
>>>>> (ユニーク制約とインデックス情報ちゃんと取れるかな...!?)
>>>> 申し訳ございませんが、現状ここまでの確認はできておりません。
>>>>
>>>>
>>>> クォートの件、0.8.9.23-SNAPSHOTにてあらためて試してみました。
>>>> ご教授いただいたとおり、まずはソース上での確認です。
>>>>
>>>> テーブル名がアルファベットの場合、
>>>> TableSqlName →○:「\"〜\"」となっている。
>>>> getTableSqlName() →○:「\"〜\"」となっている。
>>>>
>>>> テーブル名が日本語の場合、
>>>> TableSqlName →×
>>>> getTableSqlName() →×
>>>>
>>>>> (あと、DaoインターフェースのBean属性の値)
>>>> こちらは、BsDao以下にあるクラスでよろしいのでしょうか?
>>>> 見たところここのクラスには文字列の記載がありませんでした。
>>>>
>>>> littleAdjustmentMap.dfpropの設定は次のとおりとしています。
>>>>      ; quoteTableNameList = list:{コントロール; TblControl}
>>>>      ; quoteColumnNameList = list:{キー; 名称; ColKey; ColName}
>>>>
>>>>
>>>> あらためてご相談させてください。
>>>> 上記の方法でうまくいったとしましても、
>>>> テーブルが300近くあり、まだ機能変更・追加も頻繁に行われている状況で、
>>>> 現実的に難しいと考えています。
>>>> お手数ですが、他に何かよいアイデアあればご教授いただけませんでしょうか?
>>>>
>>>>
>>>> 以上、よろしくお願いいたします。
>>>>
>>>> (11/01/13 (木) 9:16), kubo wrote:
>>>>> 久保(jflute)です。
>>>>>
>>>>> なんか昔の記憶で、
>>>>> Oracle の JDBCドライバが、とあるメソッドだけ
>>>>> 日本語を許さないというのがあるのを思い出しました。
>>>>> (PKやFKは大丈夫なのに、なぜかUQやIndexだけ
>>>>> 日本語テーブルを受け付けない)
>>>>>
>>>>> 取り急ぎですが(本当に取り急ぎですが)、
>>>>> dbflute-0.8.9.23-SNAPSHOT.zip
>>>>> を使ってみて下さい。
>>>>> Oracleのときだけ例外が発生したらリトライで
>>>>> クォートして再実行するようにしています。
>>>>> (ユニーク制約とインデックス情報ちゃんと取れるかな...!?)
>>>>>
>>>>> http://dbflute.net.sandbox.seasar.org/ja/environment/newest.html#snapshot
>>>>>
>>>>>> 0.8.9.15までは「WARN」ですが、0.8.9.16以降は「ERROR」となります。
>>>>>
>>>>> こういった現象・問題が明確に上がってくるようにするために、
>>>>> 例外をつぶすのはやめました。まさに今回の件が合致しましたね。
>>>>>
>>>>>> またquoteTableNameListについてですが、
>>>>>> ログに出力されるSQLが変わるかどうか?という判断で問題ないでしょうか?
>>>>>> 0.8.9.15にて試している現状では、
>>>>>> ログ中のSQLをみるところ、テーブル名にダブルクォートはついておりません。
>>>>>
>>>>> 少なくとも CB の判断はそれでOKです。
>>>>> S2Daoに任せているところ(insert, update など)も
>>>>> 基本的にそれでOKだと思います(が、多分というところで)。
>>>>>
>>>>> ただ、そのまえに、DBMetaの TableSqlName や
>>>>> ConditionQuery の getTableSqlName() の値が、
>>>>> クォートされているかソース上で確認してみて下さい。
>>>>> (あと、DaoインターフェースのBean属性の値)
>>>>> これらがクォートされていなければ、そもそも設定の段階で
>>>>> うまくいってないということになります。
>>>>>
>>>>> #
>>>>> # やはり、英語圏で作られたツールで日本語使うと、
>>>>> # どの世界でもトラブル発生しやすいものですね...
>>>>> #
>>>>>
>>>>> 2011/1/12 井上忠彦<[E-MAIL ADDRESS DELETED]>:
>>>>>> 久保様
>>>>>>
>>>>>> ご回答ありがとうございます。
>>>>>>
>>>>>> ご教授いただきましたquoteTableNameListにて
>>>>>> 試してみようとしておりますが、現状うまくいっておらず、
>>>>>> たびたび申し訳ございませんが、確認させていただけませんでしょうか。
>>>>>> (見づらいメールとなり、申し訳ございません。)
>>>>>>
>>>>>> まず、DBFluteを0.8.9.9→0.8.9.22とアップグレードしたところ、
>>>>>> jdbc.batがエラーとなってしまいました。
>>>>>>
>>>>>> --- ここから
>>>>>> 2011-01-12 22:13:48,079 [main] INFO
>>>>>> (TorqueJDBCTransformTask#generateXML():265) - $ [Table List]
>>>>>> 2011-01-12 22:13:48,095 [main] INFO
>>>>>> (TorqueJDBCTransformTask#processTable():296) - $ MY.TBLCONTROL(TABLE)
>>>>>> 2011-01-12 22:13:48,516 [main] INFO
>>>>>> (TorqueJDBCTransformTask#processTable():296) - $ MY.コントロール(TABLE)
>>>>>> 2011-01-12 22:13:48,547 [main] ERROR
>>>>>> (DfDBFluteTaskUtil#logException():156) - Look! Read the message below.
>>>>>> /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
>>>>>> Failed to execute DBFlute Task 'JDBC'.
>>>>>>
>>>>>> [Advice]
>>>>>> Check the exception messages and the stack traces.
>>>>>>
>>>>>> [Database Product]
>>>>>> Oracle Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
>>>>>>
>>>>>> [JDBC Driver]
>>>>>> Oracle JDBC driver 11.1.0.7.0-Production for JDBC 11.1
>>>>>> * * * * * * * * * */
>>>>>> java.lang.IllegalStateException: java.sql.SQLException: コールに無効な引
>>>>>> 数があります。
>>>>>> --- ここまで
>>>>>>
>>>>>> アップグレード前のバージョン(0.8.9.9)でのdbflute.logの同様の箇所は次の
>>>>>> とおりです。
>>>>>>
>>>>>> --- ここから
>>>>>> 2011-01-12 22:12:28,628 [main] INFO
>>>>>> (TorqueJDBCTransformTask#generateXML():273) - $ MY.TBLCONTROL(TABLE)
>>>>>> 2011-01-12 22:12:40,453 [main] INFO
>>>>>> (TorqueJDBCTransformTask#generateXML():273) - $ MY.コントロール(TABLE)
>>>>>> 2011-01-12 22:12:40,484 [main] WARN
>>>>>> (TorqueJDBCTransformTask#generateXML():369) - Failed to get unique
>>>>>> column information! But continue...
>>>>>> java.sql.SQLException: コールに無効な引数があります。
>>>>>> --- ここまで
>>>>>>
>>>>>> 試しに他のバージョンでも試してみたところ、
>>>>>> 0.8.9.15までは「WARN」ですが、0.8.9.16以降は「ERROR」となります。
>>>>>> 初歩的なことかもしれませんが、何か情報ございましたら、
>>>>>> ご教授いただけませんでしょうか?
>>>>>>
>>>>>> またquoteTableNameListについてですが、
>>>>>> ログに出力されるSQLが変わるかどうか?という判断で問題ないでしょうか?
>>>>>> 0.8.9.15にて試している現状では、
>>>>>> ログ中のSQLをみるところ、テーブル名にダブルクォートはついておりません。
>>>>>>
>>>>>>
>>>>>> 以上、よろしくお願いいたします。
>>>>>>
>>>>>> (11/01/12 (水) 22:42), kubo wrote:
>>>>>>> 久保(jflute)です。
>>>>>>>
>>>>>>> 一応、報告です。
>>>>>>> quoteTableNameList と quoteColumnNameList は、
>>>>>>> ReplaceSchema の LoadData に対応していませんでしたが、
>>>>>>> 次のバージョンでは対応されます(既に修正しました)。
>>>>>>> dbflute-mysql-example に Example があります。
>>>>>>>
>>>>>>> 2011/1/12 kubo<[E-MAIL ADDRESS DELETED]>:
>>>>>>>> 久保(jflute)です。
>>>>>>>>
>>>>>>>> 井上さん、おはようございます。
>>>>>>>>
>>>>>>>> こちらをご覧下さい。
>>>>>>>> http://dbflute.sandbox.seasar.org/ja/environment/supported.html#unsupportedname
>>>>>>>>
>>>>>>>> どうにもならない状況であれば、こちらで
>>>>>>>> 言及されているオプションを試してみて下さい。
>>>>>>>>
>>>>>>>> Java版のDBFluteでは、積極的サポートしていないと言いつつ、
>>>>>>>> 実はテストもそれなりにされており、ほとんどの機能が動く状態です。
>>>>>>>> しかしながら、DBFlute.NET(C#版)ではその限りではありません。
>>>>>>>> 実際に動かしてもらわないとその精度はなんとも言えません。
>>>>>>>> また、DBFlute.NETはS2Dao.NETに処理を委譲しているため、
>>>>>>>> DBFluteの方で、EntityのBean属性にクォーテーションをしたとしても、
>>>>>>>> S2Dao.NETでそれをうまく受け取ってくれるかどうかは不明です。
>>>>>>>> (結局、とりあえず試してもらう以外にありません)
>>>>>>>>
>>>>>>>> また、そのオプションが 0.8.9.9 でサポートされていたかどうか、
>>>>>>>> ちょっとパッとコメントできませんので、これも実際にお試し下さい。
>>>>>>>> (カラム名の方は比較的最近なので、できないかもしれません)
>>>>>>>> もし、アップグレード可能であればその方が確実です。
>>>>>>>>
>>>>>>>> #
>>>>>>>> # 質問の背景が明確なので、コメントしやすくとても助かります。
>>>>>>>> # すいませんがこの後、夜までメール見れないのでご了承下さい。
>>>>>>>> #
>>>>>>>>
>>>>>>>> 2011/1/11 井上忠彦<[E-MAIL ADDRESS DELETED]>:
>>>>>>>>> 井上と申します。
>>>>>>>>>
>>>>>>>>> 質問させてください。
>>>>>>>>>
>>>>>>>>> DBFluteにて自動発行されるSQLのテーブル名・カラム名全てに
>>>>>>>>> ダブルクォートを付けることは可能でしょうか?
>>>>>>>>>
>>>>>>>>> 環境は次のとおりです。
>>>>>>>>>
>>>>>>>>> 開発言語:C#
>>>>>>>>> 開発環境:VisualStudio2008
>>>>>>>>> DB:Oracle 11.1.0.6
>>>>>>>>> S2Container.net:1.3.17
>>>>>>>>> DBFlute.net:0.8.9.9
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> そもそも問題としましては、次の通りとなります。
>>>>>>>>>
>>>>>>>>> 既に稼働済みのシステムのデータプロバイダーを
>>>>>>>>> ODP.NETに変更するため調査・確認を行っております。
>>>>>>>>>
>>>>>>>>> テーブル名・カラム名に日本語を使用しており、
>>>>>>>>> 環境によりエラーが発生します。
>>>>>>>>>
>>>>>>>>> 実行環境
>>>>>>>>> OS:7、Vista
>>>>>>>>> オラクルクライアント:11.1.0.6
>>>>>>>>> →エラーとならない。
>>>>>>>>> OS:XP
>>>>>>>>> オラクルクライアント:11.1.0.6
>>>>>>>>> →エラーとなる。
>>>>>>>>>
>>>>>>>>> エラーの内容は一定でないため、添付させていただきませんが、
>>>>>>>>> まずは日本語テーブル名・カラム名の対応と思い、
>>>>>>>>> 上記のとおり、質問をさせていただきました。
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> 以上、よろしくお願いいたします。
>>>>>>>>>
>>>>>>>>> 井上
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> seasar-dotnet mailing list
>>>>>>>>> [E-MAIL ADDRESS DELETED]
>>>>>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>>>>>
>>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> seasar-dotnet mailing list
>>>>>>> [E-MAIL ADDRESS DELETED]
>>>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> seasar-dotnet mailing list
>>>>>> [E-MAIL ADDRESS DELETED]
>>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>>
>>>>> _______________________________________________
>>>>> seasar-dotnet mailing list
>>>>> [E-MAIL ADDRESS DELETED]
>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> seasar-dotnet mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
>>
>> _______________________________________________
>> seasar-dotnet mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet



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