業務アプリケーションを作成する際、データベースに何を選択するか。
データベースコンポーネントに何を使うかは、悩みどころだと思います。
将来のことまで考えると正解があるようで、ないのが現実だと思います。
弊社では、とりあえず今ベストだと思われるものを選択。
ただし、依存部分を極力減らし、将来、上記の変更があった場合にも、なる
べく少ない変更で対応できるようにするように考えました。
この方法は、”第10回 エンバカデロ・デベロッパーキャンプ”で発表させて
いただきました。
このサンプルは、下記セッションの内容に基づいたサンプルプログラムです。
大阪会場T6セッション
「業務管理システム開発の実例にみる3層スタイルC/Sアプリ作成術」
資料URL
http://edn.embarcadero.com/jp/article/images/38706/t6.pdf
FireBird+IBX, FireBird+ADO, FireBird+DBX, Oracle+DBX、dBase+BDE(*1)
の組み合わせでのソースを作成しています。
クライアントソースは、そのままに、サーバー側ユニットを切り替えることで
上記、DBとDBアクセスコンポーネントの入れ替えを確認できます。
それおぞれの実装の違いの確認もできます。
また、この手法をとることにより、生産性もあげられ、メンテナンスもしやすいシステム構築が可能です(自己評価です)
(*1)2009/3/31バージョンで追加
また、2009/3/31改訂版では、3層SOAP実装のプロジェクトも公開しています。
詳細は、下記圧縮ファイル内のReadMe.txtをご参照ください。
###############################################################
残念ながら、サンプルソースについては、コメントがほとんどありません。
このソースに興味を持っていただき、もう少し詳しく説明がほしい方見えましたら、
交通費+呑み代 にて、ご訪問し、解説させていただきます。
メールにてお問い合わせください.
###############################################################
サンプルソース(Sample.20090404.zip)
2013.01.16 リンク先変更しました(Vectorのサイトにとびます)
初版公開 2009.03.24 Sample.20090324.zip
改定 2009.03.31 Sample.20090331.zip
dBase+BDE サーバユニット追加
3層SOAP 実装プロジェクトの追加
その他、バグ等もろもろ修正
改定 2009.04.04 Sample.20090404.zip
バグ修正
2009年10月27日
3層スタイルC/Sアプリ作成術 サンプルプログラムソース
2012年11月26日
DelphiXE3版 "3層スタイルC/Sアプリ作成術"サンプル
DelphiXE3版の"3層スタイルC/Sアプリ作成術"サンプルです。
Sample_20121126.zip
今回は、C/Sモデルとそこから展開される、SOAPクライアント、SOAPサーバーのプロジェクトが入れてあります。
データベースアクセスについては、DBXからFireBirdアクセスのみです。
SOAPサーバーについては、DelphiXEから作成できるようになったVCLスタンドアロンアプリのプロジェクトと、CGIアプリのプロジェクトの2種類を作成しています。
VCLスタンドアロンアプリについては、C/Sアプリとソースを共有するため、共有リソースの排他などは考えていませんので、あくまでもデバック用として使用すると考えてください。サーバーモジュールとしてのデバックは非常に便利です。C/Sアプリで見つけられない、3層化のためのドライバモジュール部分の不具合の確認に使用できます。
Win32でのみ動作確認しています。(追記)
SOAP Interface の引数
SOAPサーバーから、複数のデータセットの内容を戻したいとき、下記のような引数を設定することになるが、
procedure SSGetMstSlave (
const AParam: string;
out ACdsMst: Variant;
out ACdsSlave: Variant ); stdcall;
Variantが複数あるとAccessViolation例外が発生することがある。
この場合、XMLに変換して戻すようにするか、戻り値として独自のクラスを定義する方法がある。
弊社では、
TRtn2Class = class(TRemotable)
private
FRtnCode: Integer;
FRtnMsg: string;
FRtnVar1: Variant;
FRtnVar2: Variant;
published
property RtnCode: Integer read FRtnCode write FRtnCode;
property RtnMsg: string read FRtnMsg write FRtnMsg;
property RtnVar1: Variant read FRtnVar1 write FRtnVar1;
property RtnVar2: Variant read FRtnVar2 write FRtnVar2;
end;
のようなクラスを定義している。
(SOAPは独自クラスが定義できる。DelphiのSOAPサーバーインターフェイスの自動生成のサンプルコードにも例がある。)
下記の定義となる
function SSGetMstSlave (
const AParam: string ):TRtn2Class ; stdcall;
戻り値として
FRtnCode 戻り値のコード
FRtnMsg エラー等のメッセージ
FRtnVar1 ACdsMstのデータ
FRtnVar2 ACdsSlaveのデータ
を設定するようにしている。
2012年11月27日
SOAPサーバーの実装
SOAPサーバーについては、スタンドアロンVCLアプリを採用するにしろ、CGIアプリを採用するにしろ、今のところDelphiで作れば、Windowsサーバーを使用することになる。
Windowsサーバーを直接インターネットに公開するのはちょっと。。という場合は以下の方法を使うとよい(高橋さん@エンバカに教えてもらった)。
Linuxサーバーのリバースプロキシ機能を使い、Linuxサーバーをインターネットのフロントに置き、Windowsサーバーをその後ろに隠す方法がある。
設定は、Httpd.confに下記のように2行書くだけ
ProxyPass /foo http://foo.example.com/bar
ProxyPassReverse /foo http://foo.example.com/bar
詳細は、”Apache proxyPass”などで検索。
2013年02月28日
SOAP アプリケーション ウィザードの使い方
SOAP アプリケーション ウィザードの使い方の場所です。
DelphiXE3
ms-help://embarcadero.rs_xe3/rad/SOAP_アプリケーション_ウィザードの使い方.html