C#ユーザの皆様へ
概要
C#版DBFluteを利用されるユーザの皆様へのメッセージがあります。利用上の注意点などプログラミングする上での重要な点もありますので、必ずお読みください。
Java版との機能差
まずは外部仕様的な面において、以下の項目(主なものだけPickup)がC#版では実装されていません。 (上から順に優先度)
- ConditionBeanの「scalarSelect」:select max(abc) from ...)
- ConditionBeanの「scalarSubQuery」:where abc > (select max(abc) from ...) *0.8.9.2にて対応
- ConditionBeanで子テーブル導出カラムで絞り込み「(Query)DerivedReferrer」 *0.8.9.2にて対応
- その他細かい点
- ジェネリックをできる限り利用してソース量の削減
- その他細かい点
Java版との仕様差
今度は、機能差ではなく仕様差です。
ほとんどJava版と仕様は同じなのですが、どうしても言語の違い、Seasar本体の違い、ニーズの違い、リソース不足の点などから
仕様の差が発生します。以下の項目がJava版とは違うC#版の仕様です。
- BehaviorのContainerとしてS2ContainerではなくQuillを使っている
- クラスコメントやメソッドコメントはほとんど記載しない
- Daoインターフェースを生成しない機能
- ProcedureのResultSetはサポートしない
- バッチ更新はサポートしない(そもそもS2Daoの対応が必要)
- ConditionBeanでselectCursor
- PKのないテーブルでのEntityによるInsert機能
- OracleのSelect句のAlias30文字問題回避機能
- Java版でも人気のない機能(メソッド)はサポートしない
- その他細かい点
Java版との実装差
今度は、仕様差ではなく実装差です。
実際にC#ユーザの方がDBFluteで実装するときに意識する必要のある実装方法の違いです。
実はここが一番大事ですね...早速見ていきましょう!
メソッド名の先頭が大文字
これはDBFlute関係なく、JavaとC#の文化の違いです。ただ、VisualStudioを使っていれば補完してくれるのであまり気にする必要はないでしょう。
リフレクションを使ってメソッド名の文字列からメソッドを呼び出す場合などに注意して下さい。
ex) C#版でConditionBeanを利用
MemberCB cb = new MemberCB();
cb.SetupSelect_MemberStatus();// Java: cb.setupSelect_MemberStatus();
cb.Query().SetMemberName_PrefixSearch();// Java: cb.query().setMemberName_PrefixSearch();
cb.FetchFirst(20);// Java: cb.fetchFirst(20);
プロパティ名の先頭が大文字
これもDBFlute関係なく、JavaとC#の文化の違いです。ex) C#版でEntityの値を設定
Member member = new Member();
member.MemberId = 3;
member.MemberName = "Billy Joel";
しかし、このことに非常に気をつけるべき箇所が1つあります。それは、外だしSQL(OutsideSql)を利用するときのパラメータコメントです。
外だしSQLのパラメータコメントについてはこちら
C#版ではパラメータコメントの中で利用するプロパティ記述も先頭が大文字になります。
(要はパラメータコメントは大文字小文字を区別していることを意味します)
ex) C#版でバインド変数コメントを利用
where MEMBER_ID = /*pmb.MemberId*/3 -- Java: /*pmb.memberId*/
and MEMBER_NAME like /*pmb.MemberName*/'ス' || '%' -- Java: /*pmb.memberName*/
and MEMBER_STATUS_CODE in /*pmb.MemberStatusCodeList*/('FML', 'WDL') -- Java: /*pmb.memberSta...*/
コールバック処理でDelegateを利用
これもDBFlute関係なく、JavaとC#の文法の違いです。ex) C#版でBehaviorのLoadReferrerを利用
_memberBhv.LoadPurchaseList(memberList, delegate(PurchaseCB cb) {
cb.Query().SetPurchaseCount_GreaterEqual(2);
cb.Query().AddOrderBy_PurchaseCount_Desc();
}
// Java:
// _memberBhv.loadPurchaseList(memberList, new ConditionBeanSetupper<PurchaseCB>() {
// public void setup(PurchaseCB cb) {
// cb.query().setPurchaseCount_GreaterEqual(2);
// cb.query().addOrderBy_PurchaseCount_Desc();
// }
// })
但し、複数メソッドのコールバックがある場合などは、Java版と同じくインターフェースを利用します。しかし、そのときはC#は匿名メソッドはあっても匿名クラスはないので、実装クラスを明示的に作成します。
SQLファイルを「埋め込まれたリソース」に
これはC#固有(VisualStudio固有)の話で、とってもやっかいな話です。VisualStudioでSQLファイルなどのリソースファイルをDLLの中に埋め込むためには、
そのファイルのプロパティの「ビルドアクション」を「埋め込まれたリソース」にする必要があります。
デフォルトでは「なし」になっているので、これを怠ると実行時に「SQLファイルがありません」という例外になります。
「ファイル名は間違ってないんだけどなぁ...何が悪いんだろう」と感じたら真っ先にこれを疑って下さい。
今まで何人もの人がこの壁にぶち当たっています。
VisualStudioの設定でデフォルトを「埋め込まれたリソース」にできないものか探したのですが見つからず。
*.csprojに<EmbeddedResource Include=”**\*.sql” />と指定することでできるようですが、
間違ってVisualStudio上でビルドアクションをいじると展開されて設定が戻ってしまうのでいまいちです。
今は気をつけて下さいとしか言いようがないのですが、DBFluteでは将来的にoutsideSqlTestタスクに
「外だしSQLが埋め込まれたリソースになっているかどうか」をチェックする機能を検討しています。
ReSharperのススメ
これは必須ではありませんが、ReSharperをおすすめします。DBFluteのウリの一つとして、IDEの補完機能でサクサク実装することが挙げられるのですが、
VisualStudioの補完機能はEclipseのそれに比べて遥かにストレスの溜まるものです。
ReSharperはそれを補ってくれるVisualStudioのAdd-inです。
ライセンス料が必要なので敷居が高いですが、あれば便利であることは間違いありません。
Exampleのススメ
C#版DBFluteのExampleの実装があります(Testを兼ねる)。こちら実装の参考になるだけでなく、気軽に自動生成されたDBFluteのクラスを実際に触ることができます。
実際に動かすことも可能です。MySQLとMbUnitを用意して頂くことで、実際にDBアクセスが可能です。
(dfnet-basic-example/readme.txtをお読みください)
Subversion経由でチェックアウトが可能です。リポジトリURLは以下:
https://www.seasar.org/svn/sandbox/dbflute.net/trunk/dfnet-basic-example
都度都度更新していますので、時折更新してみて下さい。
ドキュメントはJava版と同居
これは謝らなければならないことです。大変申し訳ありません。ですが、現状のリソースからはどうしてもそうせざるを得ません。
現状(2008年1月頃)では、Java版のドキュメントから先述した実装差を考慮して読むようにして下さい。
その中で、あまりに違う部分などについては「C#版ではこうこうこうなる」というように注釈をいれます。
また、先述したC#版DBFluteのExampleも参考にしてみて下さい。
