[seasar-dotnet:2174] Re: S2Dao.NETでAccessファイルを使う際、JOIN時に括弧が必要なMDB独自仕様への対処について
kubo
[E-MAIL ADDRESS DELETED]
2012年 6月 26日 (火) 11:21:39 JST
久保(jflute)です。
齋藤さん、コードの提供ありがとうございます!
MS Access だけややこしいですよね。
(自分も似たコードを書いたのでしみじみ)
あと、Seasar.NETの現状のご理解ありがとうございます。
2012/6/25 SAITOH Daisuke <dsaitoh @ grn.janis.or.jp>:
> 久保さん・小谷さん
>
> 齋藤です。
> ご回答ありがとうございます。手元での修正方針は問題なさそうで安心しました。
>
> またS2Dao.NETの現状等を理解しました。
> 残念ですが、安定しているものをあまり使わない機能のために修正するのはメリットが少ないですね。
>
> ちょっとしたコードですが、手元で動かしているものを貼付けておきます。
> MDB.csを上書きし、Seasarをビルドし直して使用します。(外装する方法を思いつきませんでした)
>
> ----ここから
> using System.Collections;
> using System.Text;
>
> namespace Seasar.Dao.Dbms
> {
> public class MDB : Standard
> {
> public override string Suffix
> {
> get { return "_mdb"; }
> }
>
> public override string IdentitySelectString
> {
> get { return "select @@identity"; }
> }
>
> public override KindOfDbms Dbms
> {
> get { return KindOfDbms.MDB; }
> }
>
> protected override string CreateAutoSelectFromClause(IBeanMetaData beanMetaData)
> {
> StringBuilder buf = new StringBuilder(100);
> string myTableName = beanMetaData.TableName;
> buf.Append(myTableName);
> for (int i = 0; i < beanMetaData.RelationPropertyTypeSize; ++i)
> {
> IRelationPropertyType rpt = beanMetaData.GetRelationPropertyType(i);
> IBeanMetaData bmd = rpt.BeanMetaData;
> buf.Insert(0, "(");
> buf.Append(" LEFT OUTER JOIN ");
> buf.Append(bmd.TableName);
> buf.Append(" ");
> string yourAliasName = rpt.PropertyName;
> buf.Append(yourAliasName);
> buf.Append(" ON ");
> for (int j = 0; j < rpt.KeySize; ++j)
> {
> buf.Append(myTableName);
> buf.Append(".");
> buf.Append(rpt.GetMyKey(j));
> buf.Append(" = ");
> buf.Append(yourAliasName);
> buf.Append(".");
> buf.Append(rpt.GetYourKey(j));
> buf.Append(" AND ");
> }
> buf.Length = buf.Length - 5;
> buf.Append(" ) ");
> }
> buf.Insert(0, "FROM ");
> return buf.ToString();
> }
> }
> }
> ----ここまで
>
> On 2012/06/23, at 15:29, kubo wrote:
>
>> 久保(jflute)です。
>>
>> 齋藤さん、こんにちは
>> 取り急ぎのコメントさせて頂きます。
>>
>>> 1.Accessで複数テーブルをJOINするには、各JOINを括弧でくくる必要がありますが、
>>> S2Dao.NETのSELECT文自動生成機能では括弧がつきませんでした。
>>> 設定や追加コードで括弧をつけてJOINさせることは可能ですか。
>> Seasar.Dao.Dbms.MDBでそういった処理がされていなければ、
>> そういった機能は実装されていないと言えます。
>> (DB依存処理は基本的にDbms配下に集約されます)
>>
>>> 2.いまのところはOracleでの処理を参考に、Seasarのソースに手を入れてビルドし使用しています。
>>> 具体的には、Seasar.Dao.Dbms.MDB クラスの、
>>> CreateAutoSelectFromClause メソッドをオーバーライドして、
>>> 括弧つきのFROM句を生成するようにしています。
>>> 暫定の対処方法はこれで合っているでしょうか。
>> 拡張の仕方としては、Dbmsのクラスを拡張するでOKです。
>> とりあえずそれでうまくSQLが生成されているでしょうか?
>> そうであれば、特に問題ないと思います。
>> (S2Daoの生成ロジックはシンプルなので)
>>
>>> 3.現在未対応の場合、MDBの複数JOINに対応される予定はありますでしょうか。
>>> ※必要でしたら2のコードを提出いたします。
>> とりあえず正直に言いますと予定はないです。
>> リソースの問題上、S2Dao.NETに新たに手を入れるというのは、
>> よほどのことでない限りやらないという方針で、
>> 「S2Dao.NETは安定優先の現状維持で、機能を加えるならDBFlute.NET」
>> という感じです。(DBFlute.NETでは今回の件、既に対応済みのはず)
>>
>> 2のコードを提供して頂けると助かります。ありがとうございます。
>> ただ、大変申し訳ございませんが、本体に組み込むにしても、
>> 環境整えてテストしてリリース作業とそれなりの作業が必要になるため、
>> いつ取り込めるかは未定となります。
>> それでも、同じ問題に遭遇した人がそれをみて同じように回避できれば
>> 意義のあることですので、ML上にて公開して頂けるととてもうれしいです。
>>
>> 色々と不都合あってご迷惑おかけします。
>>
>> 2012/6/23 齋藤 大輔 <dsaitoh @ grn.janis.or.jp>:
>>> 初めまして、齋藤と申します。よろしくお願い致します。
>>>
>>> Seasar.NETを便利に使わせていただいてます。
>>> テスト環境(および一部運用環境)でMDBファイルを使いたいという要件があり、
>>> いくつか教えていただきたく思います。
>>>
>>> 1.Accessで複数テーブルをJOINするには、各JOINを括弧でくくる必要がありますが、
>>> S2Dao.NETのSELECT文自動生成機能では括弧がつきませんでした。
>>> 設定や追加コードで括弧をつけてJOINさせることは可能ですか。
>>>
>>> 2.いまのところはOracleでの処理を参考に、Seasarのソースに手を入れてビルドし使用しています。
>>> 具体的には、Seasar.Dao.Dbms.MDB クラスの、
>>> CreateAutoSelectFromClause メソッドをオーバーライドして、
>>> 括弧つきのFROM句を生成するようにしています。
>>> 暫定の対処方法はこれで合っているでしょうか。
>>>
>>> 3.現在未対応の場合、MDBの複数JOINに対応される予定はありますでしょうか。
>>> ※必要でしたら2のコードを提出いたします。
>>>
>>> 以上、よろしくお願い致します。
>>>
>>> --
>>> 齋藤大輔
>>> dsaitoh @ grn.janis.or.jp
>>>
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> seasar-dotnet @ ml.seasar.org
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>> _______________________________________________
>> seasar-dotnet mailing list
>> seasar-dotnet @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
>
> _______________________________________________
> seasar-dotnet mailing list
> seasar-dotnet @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
seasar-dotnet メーリングリストの案内