初めまして。ぽんつくと申します。
sourceforgeに置かれているDelphi Email Clientというプロジェクトをダウンロードし解凍してみたのですが、
うまく動きません。何とか動かしたいのでご教授お願いします。
現在以下のような状況です。
1 付属のビルド済みファイル「DelphiEmail.exe」を起動しようとすると「Unavailable database」のエラーが出ます。
(このプログラムは受信メール等の情報をデータベースとして管理しています。)
2 添付のデータベースの拡張子が.FDBであったため、試しに「Firebird Embedded Server」のDLLファイルを
プロジェクトと同一フォルダ内にコピーしてみると、エラーの内容が「Access violation at address 0062261E in
module "DelphiEmail.exe'. Read of address 00000004.」になります。
ここで取りあえず付属の実行型ファイルの起動をあきらめ、プロジェクトを開いてみることにしました。でも
3 プロジェクトを開こうとすると「応答なし」になってしまいます。
4 仕方ないので空のプロジェクトを作成して各ユニットを追加しビルドすると、起動はするのですが、
「プロジェクトtest.exeがEaccess violationクラスの例外を生成しました。……」というエラーが出ます。
このエラーはEmailPop3ユニットのPOP3_Initiateというファンクションの以下の行で発生しているようです。
FoldersTable.SelectSQL.Strings[1] := 'where USERNAME = ' + #39 + UserDetails.UserName + #39;
原因は良く分からないのですが、プロジェクトが開けない問題を除くと、不具合の要因はデータベースの管理
に起因しているようです。特にエラーが発生する行を見ると、FolderTableデータセットにアクセスしたのが原因
ではなく、代入しようとしているUserDetails.UserNameを格納しているEmailTableデータセットにアクセスしたこと
によってエラーが発生するようです。どなたか、このプロジェクトをビルドして成功なさった方はいらっしゃいます
でしょうか?何か情報をいただけると嬉しいです。
ちなみに私の環境はWindows7+Delphi7という組み合わせで、プロジェクトが想定している環境とは異なりますが、
XE5を試しにトライアルでインストールしてもプロジェクトは開くことができませんでした。またDelphi7ではありますが、
プロジェクトに付属の「EmbeddedWB」「PBear THtml」は勿論、Project JEDIの「JCL」「JVCL」はインストール済みです。
またDelphi7付属のIndyでは不足が出るため、Indy10に入れ換えてあります。
よろしくお願いします。
とりあえず、EMAILS.FDB が C:\Program Files\Delphi Email\Data から
読み込まれる仕様をどうにかしてみてはいかがでしょうか?
# 想定されている Delphi は 2009 のようですね。
DEKO様、早速のアドバイスありがとうございます。
確かに色々更新が入るデータベースを置くには、
良い場所ではありませんね。
現在作成中のプロジェクトは、\users\の下の\Documents
の下にありますが、同じフォルダ内から読み込む様に変更
してみました。でも、残念ながら動いてくれません。
引き続きご指導お願いします。
> でも、残念ながら動いてくれません。
エラーメッセージからするに、何かを Creete せずに使っちゃったとか、
そういった感じのバグのように思えます。
ソースのコメントに、
"21/08/2009 - Posted on Sourceforge, very buggy, supports MAPI, IMAP and POP3."
なんて書いてあるくらいですからね…(^^;A
そもそもちゃんと動くものをアップしたのかすらアヤしいレベルです。
オプソなので自力でどうにか解決するより他はないかもしれません。
# 申し訳ないですが、コンポーネントをインストールしてまで、
# 原因を追求する気にはなれませんです… m(_ _)m
DEKO様
確かに…このプロジェクトが本当に動くのか色々怪しいですね。
ただ、sourceforgeにレビューを寄せている人が2人(^^;もいたので、
ひょっとして日本でも動かした強者がいるのではないか…と思った次第です。
>何かを Creete せずに使っちゃったとか、
試しにエラーが出る1行前に、以下の行を追加してみました。
UserDetails := TUserInfo.Create;
その結果、デバッガーのエラーが以下の通り変化しました。
プロジェクトtest.exeがEIBInterBaseErrorクラスの例外を生成しました。
'Dynamic SQL Error
SQL error code = -206
Column unknouwn
EMAIL.JOBREF
At line 1,column8'
カラムの名前とか、間違っていないはずなのですけど…
> コンポーネントをインストールしてまで…
ありがとうございます。私もそこまでお願いできません。
でも、動かした猛者がいないかも含め、もう少しこのスレッドはこのままに
させていただきたいです。引き続きご指導お願いします。
> EMAIL.JOBREF
テーブル EMAIL の最後にフィールド JOBREF (Integer) を追加してやる必要があるようです。
> ただ、sourceforgeにレビューを寄せている人が2人(^^;もいたので、
以前の "正常に動作していたバージョン" のレビュワーかもしれませんけどね (^^;A
>以前の "正常に動作していたバージョン" のレビュワーかもしれませんけどね (^^;A
ぎくぎくっ!!…(|||△|||) 本当だ!!投稿されたのは2009年と2010年ですね…
確かに、そうかも知れません…(^^; 不安が倍増しました…
>テーブル EMAIL の最後にフィールド JOBREF (Integer) を追加してやる必要があるようです。
アドバイスありがとうございます。
このソース非常に読みにくいのですが、調べてみるとJOBREFは、TPop3Formクラスのずっと下の方で、
TIntegerFieldとして定義されていました。
どうにも良く分からないので、function TPop3Form.POP3_Initiateの最初に次の4行を追加してみました。
FoldersTable.Open;
AttachmentTable.Open;
EditFoldersTable.Open;
EmailTable.Open;
このユニットの中で使用されている4つのデータセットをそれぞれオープンしてみた訳ですが、
最初の3行はエラー無くオープンできたのに、EmailTableをオープンすると先の'Dynamic SQL Errorが
発生します。この段階では、SQLは何もしていないはずなのですけど…
> このソース非常に読みにくいのですが、調べてみるとJOBREFは、TPop3Formクラス
> のずっと下の方で、TIntegerFieldとして定義されていました。
EmailPop3 ユニットのコンポーネントに指定されている SQL に JOBREF があります。
select
EMAIL.EMAILID,
EMAIL.USERNAME,
EMAIL.EMAILFOLDER,
EMAIL.EMAILCONTENT,
EMAIL.HEADER,
EMAIL.EREAD,
EMAIL.JOBREF
from
EMAIL
where
EMAIL.EMAILID = :EMAILID
insert into EMAIL
(
EMAIL.EMAILCONTENT,
EMAIL.EMAILFOLDER,
EMAIL.EMAILID,
EMAIL.EREAD,
EMAIL.HEADER,
EMAIL.JOBREF,
EMAIL.USERNAME
)
values
(
:EMAILCONTENT,
:EMAILFOLDER,
:EMAILID,
:EREAD,
:HEADER,
:JOBREF, '
:USERNAME
)
update EMAIL
set
EMAIL.EMAILCONTENT = :EMAILCONTENT,
EMAIL.EMAILFOLDER = :EMAILFOLDER,
EMAIL.EMAILID = :EMAILID,
EMAIL.EREAD = :EREAD,
EMAIL.HEADER = :HEADER,
EMAIL.JOBREF = :JOBREF,
EMAIL.USERNAME = :USERNAME
where
EMAIL.EMAILID = :OLD_EMAILID
つまり、EMAIL テーブルに JOBREF フィールドが必要という事ですので、
フィールドを追加してみてください。
>EmailPop3 ユニットのコンポーネントに指定されている SQL に JOBREF があります。
なるほど…
Pop3Formの「EmailTable:TIBDataSet」を右クリック→「データセットの編集」→
「SQL文」の中で定義されていたのですね。勉強になります。
>つまり、EMAIL テーブルに JOBREF フィールドが必要という事ですので、
>フィールドを追加してみてください。
Pop3Formの「EmailTable:TIBDataSet」を右クリック→「項目の設定」を選択すると
EmailTableの中の項目一覧が表示されますが、JOBREFもその中で定義されていました。
DEKO様が「フィールドの追加を」というのは、ここの部分のことですか?
(良く分からなくて済みません)
> DEKO様が「フィールドの追加を」というのは、ここの部分のことですか?
いえいえ。
Firebird の DB ファイルである EMAILS.FDB の EMAIL テーブルに
JOBREF を INTEGER 型のフィールドとして追加してみてください。
アーカイブの中の EMAILS.FDB の EMAIL テーブルは
以下の様なフィールド構成になっています。
EMAILID INT64
USERNAME VARCHAR(30)
EMAILFOLDER INTEGER
EMAILCONTENT BLOB
HEADER BLOB
EREAD SMALLINT
DB 側に JOBREF フィールドがないんですよ。
> Column unknouwn
> EMAIL.JOBREF
これでは件の SQL エラーが出るのは当然です。
>DB 側に JOBREF フィールドがないんですよ。
!なるほど!!そうだったのですか!!!
ソースばかり見ていても駄目だったのですね…勉強になります。
>JOBREF を INTEGER 型のフィールドとして追加してみてください。
実はFirebirdを使うのは初めてで、今これを書きながらフィールドの追加の方法を
調べています。(^^;
Firebird ISQL Toolというのを使えば良いらしいことが分かってインストールし、
今EMAILS.FDBのテーブル一覧を見るところまで来ました。
画面はこんな感じです。
SQL> show tables;
EMAIL EMAILATTACHMENT
EMAILFOLDERS
この後、恐らくEMAILの中を見て、フィールドを追加する手順があるのですね…
>SHOW FIELDS FROM EMAIL;
と入力すると、
Command error : SHOW FIELDS FROM EMAIL
になってしまいます…
>DESCRIBE EMAIL;
と入力すると、
-SQL error code = -104
-Token unknown - line 1 , column 1
-DESCRIBE
になってしまいます…(T△T)
IBConsole を DL して
テーブルのプロパティを右クリックするとフィールドを追加できます。
[IBConsole 日本語版+α]
http://ht-deko.minim.ne.jp/junkbox.html#IBCONSOLE
詳しくはユーザーズガイドの P.31〜32 を参照してください。
SQL で追加する場合には ALTER TABLE を実行します。
http://firebirdwiki.jp/index.php?ALTER%20TABLE#ffcf3b20
ALTER TABLE EMAIL ADD JOBREF INTEGER;
こんな感じです。
Firebird そのものに関しては
[Forum » Delphi » データベース開発 (Delphi Forum)]
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewforum&f=11
この辺から検索してみてください。
>IBConsole を DL して
> テーブルのプロパティを右クリックするとフィールドを追加できます。
おお!これはとてもありがたいです!!
日本語化されている上にFirebirdに対応しているなんて凄いです!!
Firebirdに関しては、日本語の情報があまりないので
「DEKO様は詳しいなぁ…」と思っていたのですが、
ツールまで作成されていたのですね。
ただ残念ながら、今日はデータベースを読み込むところまでできませんでした。
「サーバーの登録と接続」でローカルを選択し、userに「sysdba」passwordに「masterkey」
と入力しエンターすると、「Cannot attach to password database」という
エラーが出てしまいました。
コマンドラインでgsec.exeを呼び出しても同じエラー「unable to open database」
が出たので、これはIBConsoleの問題ではありません。
元々Delphi Email Clientをさわり始めたときはembed版のdllをリネームして使っており、
今回初めてFirebirdをインストールしたので、その手順に問題があるのだと思います。
Firebird_2_5直下にあるsecurity2.fdbのパーミッションの問題らしいのですが、
今日一日色々調べたのですが、原因究明と解決には至りませんでした。
それにしても…X68030 懐かしいですね(^ω^
フィールドの追加できました!
件のsecurity2.fdbのアクセス権を変更することで、
テーブルにJOBREFを追加できました!!
変更した新しいデータベースを読み込んだところ、
今度はDynamic SQL Error …
Column unknown EMAIL.EMAILTOが出ました。
ソースを見るとEMailTableには、EmailToから
EmailPriorityまでのフィールドが、後から追加になった
様です。
ということはDEKO様に教えていただいたように、
オブジェクトにはSQLを、データベースのテーブルには
フィールドを追加する必要があるのですね^_^;
中々一筋縄では行きません。
早速、データベースにstring型のフィールドを追加しようと
したところ、
Specified domain or source column string does not exist
と…
String型は使えないみたいですね^_^;
> Cannot attach to password database
リンク先にもあったかと思いますが、Firebird DB を管理するには、
Embedded Server ではなく、通常の Firebird をインストールする必要があります。
[何度も出てくるので Firebird の接続方法]
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1255
また、Firebird の初期ユーザ名&パスワードは Linux でない限り、
"SYSDBA" & "masterkey" です (大文字/小文字が区別されます)。
> String型
SQL 型 DB には "String 型" というものはなく、
文字列型は CHAR() または VARCHAR() 型となります。
Firebird も同様なので VARCHAR() でフィールドを定義してください。
通常の Firebird をインストールしていても接続できない場合、
GDS32.DLL がその Firebird 付属のものではない可能性があります。
GDS32.DLL を検索して調べてみてください。
動きました!!(T▽T)
いや、正確にはまだ動いていないのですが、今までは起動時に正常にデータベースが読み込めず、
エラーを生じることなくOnShowまで辿り着けなかったのが、取りあえず普通に起動するようになりました!!
今はまだメールの受信も送信も正常に動きませんが、最大の難関だったFirebirdの制御が
DEKO様に色々ご教授いただいたおかげで、普通に動き始めたです!!!
内容的には、まず通常のFirebirdをインストール。その後EmailTableにVARCHAR() 型で各フィールドを追加、
コンポーネント内のSQLも追加し、更に AttachmentTableにも追加アイテムがあったので、矢張りフィールドと
SQLを追加しました。
ここまでこれたのは、DEKO様にFirebirdについて色々ご教授いただいたおかげです!!
お礼の申し上げようもありませんが、本当にありがとうございました。
きっと正常に動くまでに、またここに質問に来ると思いますが(^^;、どうかまたお助け下さいませ。
本当にありがとうございました。
ツイート | ![]() |