データモデュールでのTIBDatabaseのDBファイル指定について
Delphiにてデータベースアプリを作成しています。
RDMSは(Firebied) Interbase を使い IBX にて接続しています。
設計時 TIBDatabase の ”Database"プロパティで目的のDBファイルを指定します。
設計時は直接 X:\ZZZZ\AAAAA.FDB などと指定すればよいのですが、
大きく内容を変更したいときなど、元のファイルをすべて残すために新たにフォルダーを作り、
新しいフォルダーにファイルをコピーしてそれを読み込み新バージョンとして作成しています。
ここまでは履歴を残すうえで必須の手法であると思いますが、
ここで履歴管理のためフォルダーに追番を付けて管理しています。
例===X:\ZZZZ0001\
===X:\ZZZZ0002\ などです。
また、PCも複数使い管理手法の違いからフォルダー名が統一できていない状況です。
このようにフォルダー名を変えていった場合に、
上記のDBファイルの直接指定のつじつまが合わなくなることがあります。
(違うフォルダーのファイルを見ているような感じです)
実行時はカレントフォルダーのDBファイルを指定するのは下記のようにできますが、
procedure DM1.TIBDatabase1BeforeConnect(Sender: TObject);
begin
DM1.TIBDatabase1.DatabaseName := GetCurrentDir + '\AAAAA.FDB';
end;
設計時に自動でカレントフォルダーのDBファイルをセットできるような手法はどうすればいいのでしょうか?
Windows Delphi firebird のバージョンには依存していませんので一般的な手法として考えていただければいいと思います。
ちなみに現在の開発環境は Win10Pro Delphi10_Seattle Firebird3 です
普通はバックアップのほうを連番とかでgbakするようにも思いますが、このような場合はデータベースエイリアスを使ったらどうでしょう?
http://firebirdwiki.jp/webroot/?%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%28aliases.conf%2Ffirebird.conf%29%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9
https://firebirdsql.org/rlsnotesh/config-db-alias.html
エイリアスを使って接続していれば、Aliases.confを書き換えるだけです。
ちなみにカレントディレクトリはいろいろあるのであまり使わないことをお勧めします(異論は認めます
エリアスですが、数種類のDBアプリを並行して開発していますので、
固定できません。
と、共に、"GetCurrentDir" ですが出来上がったアプリを配布しますので、
その環境(アプリを置くフォルダーが固定できないので)によって変ってくるので
使用しています、。他の対処方法はあるでしょうか???
> 使用しています、。他の対処方法はあるでしょうか???
ガイドラインというのはあります.
必ずこれに従わなければいけないというものではありません.
しかし,ガイドラインがあるということを知っておくことは大切でしょう.
[ アプリケーション固有のデータの置き場所 ]
http://mrxray.on.coocan.jp/Delphi/Others/Windows_Guidelines.htm
ガイドラインも理解していますが、
使用される方によりそれぞれの考え方があるようなので、
フォルダーやドライブも一定していません。
当然、環境変数などといっても理解できないような方も含まれますので、
EXEファイルとデータファイルを同一フォルダーに置き簡単に使えるようなコンセプトで開発しています。
一般的な例えですが「アドレス帳」の様な誰でも使えるような感じのアプリです。
それだけにレジストリーも使用せずに、バカチョン!で使用できるような感じに作成しています。
追伸:配布時にはembededでDBファイルにアクセスするような構成としています。
EXEファイルと同じ場所を取得したいならGetCurrentDirよりも
Application.ExeNameからパスを取得した方が安全だし確実だと思います
実行時のパスの設定のアドバイスには感謝いたします。
このスレッドの問い合わせは「設計時」のDBファイルの場所設定です。
設計時のソースファイルがあるフォルダーの自動入手はどうすれば可能でしょうか。
それとも、都度都度プロパティでDBファイルを指定しなければならないのでしょうか。
> 都度都度プロパティでDBファイルを指定しなければならないのでしょうか。
そのとおりです。
設計時の動作を変えるにはコンポーネントを作るしかない
。
type
TIBDatabaseEX = class(TIBDatabase)
private
protected
public
constructor Create(AOwner: TComponent); override;
property BeforeConnect;
end;
constructor TIBDatabaseEX.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
DatabaseName := 'XXXXXX';
end;
これで
貼り付けたとき DatabaseName は XXXXXX になる
AAA様
ありがとうございます。
まだ、確認はしていませんが、Create時にDatabaseNameを指定しているわけですので、
実行時と同じような動きをさせていると理解しています、
この方法では、設計時にフォルダー及びファイル名をそれぞれ指定していますので、
プロパティを都度変えているのと変わりないと思います。
上に書いたように、開発がうまくいかなかった場合に、履歴管理している過去のフォルダーに戻ったりしていますので、
このようなときに最新の使用フォルダーであることを明確にするため、フォルダー名を変更したりしています。
追番の2桁目や3桁目を変えていっています。
このように、フォルダー名が急に変った場合でも、設計時にカレントフォルダーを何とか取ってこれないのかなと思ったわけです。
通りすがりさんのアドバイスのように
>> 都度都度プロパティでDBファイルを指定しなければならないのでしょうか。
>そのとおりです。
で、開発を進めていきたいと思います。
皆様、ありがとうございました。
本番環境では
X:\ZZZZ\AAAAA.FDB
X:\ZZZZ\AAAAA.EXE
のようになっていて カレントディレクトリィの AAAAAA.FDB を使っている
>このように、フォルダー名が急に変った場合でも、設計時にカレントフォルダーを何とか取ってこれないのかなと思ったわけです。
開発環境では
X:\ZZZZ0001\AAAAA.FDB
X:\ZZZZ0002\AAAAA.FDB
X:\ZZZZ0003\AAAAA.FDB
のようになっていて最新の X:\ZZZZ0003\AAAAA.FDB を自動で設定したいって事
だと思うんだけど
設計時に自動に設定する方法ではなく
X:\ZZZZ0003\AAAAA.FDB の探し方を知りたいって言ってる?
単純に AAAAAA.FDB を探して、日付が一番新しいやつ
を databaseName に設定すれば良いだけでは?
設計時に設定する必要はないけどね
AAA様
申し訳ありませんが、フィールドの追加などDBの基本構造も変わっていたりしていますので、
最新のものを指定するだけでは、元に戻ってフィールドが追加されていないDBファイルから、
もう一度考え直すような設計ができにくいです。
(追加されたフィールドは無視すればいいのですが)
また、DBファイルはアクセスすると最新の日付になるので「日付が一番新しいやつ」ではだめだと思います。
やはり、「自動的に設計時にカレントフォルダーのDBファイルのセット」は無理なのでしょう。