別PCでコンパイルした際正常なexeができない問題

解決


YKK  2013-05-01 01:44:42  No: 44469

環境:Delphi7
OS:Windows7 64bit
DB:Firebird1.5

開発を行っていたXPのPC(PC1)からソース、exe、ライブラリパスの追加参照フォルダをそのまま別のPC(PC2)へコピーしてコンパイルを行った際にコンパイルは行えるのですが一部機能が使えなくなってしまいます。具体的には以下の通りです。

取り込みボタンを押した時CSVファイルを選択して取り込み、登録ボタンを押した時取り込んだ内容をテーブルに登録するという処理があるのですが
1.PC1でコンパイルしたexe、PC1でのステップ実行する。
  正常に動作する。
2.PC1でコンパイルしたexeをPC2で実行する。
  正常に動作する。
3.PC2でコンパイルしたexe、PC2でステップ実行する。
  DBに何も登録されない。
※PC2はXP、7 32bit、7 64bitでテスト。

登録ボタンを押した時の動作
procedure TForm.actPostExecute(Sender: TObject);
begin
  inherited;
  StartTransaction(ibcdsHData.DBTransaction);
  try
    ibcdsHData.ApplyUpdates(0); //…①
    ibcdsHDetail.ApplyUpdates(0); //…②

    Commit(ibcdsHData.DBTransaction); //…③
    StatusMode := smNone;
    ClearGrid;
  except
    Rollback(ibcdsHData.DBTransaction);
    ShowMessageDlg(CI_MES_POST_ERROR);
  end;
end;

procedure StartTransaction(ibtrnTransaction: TIBTransaction);
begin
  if not ibtrnTransaction.InTransaction then
    ibtrnTransaction.StartTransaction;
end;

procedure Commit(ibtrnTransaction: TIBTransaction);
begin
  if ibtrnTransaction.InTransaction then
    ibtrnTransaction.Commit;
end;

※ibcdsHData、ibcdsHDetail共にTIBClientDataSet型です。

PC2でステップ実行した際のエラー
①でステップ実行を行う(F7クリック)。
「プロジェクト Project.exe が EIBClientError クラスの例外を生成しました。
'SQL パーサーエラー:
パラメータ名が必要です。'
プロセスは停止しています。再開するにはステップ実行または実行を選択してください。」…エラー1
と表示され次の行に処理が移る。

②でステップ実行を行う。
1回目F7を押した時。
「プロジェクト Project.exe が EDatabaseError クラスの例外を生成しました。
'レコードが見つかりませんでした。キーを指定されていません'
プロセスは停止しています。再開するにはステップ実行または実行を選択してください。」…エラー2
と表示される。次の行へ処理は移らない。

2回目F7押した時。
何も起こらない。次の行へ処理は移らない。

3回目F7押した時。
エラー1が表示される。次の行に処理が移る。

③でステップ実行を行う。
1回目F7を押した時。
エラー2が表示される。次の行へ処理は移らない。

2回目F7押した時。
何も起こらない。次の行へ処理は移らない。

3回目F7押した時。
procedure Commit(ibtrnTransaction: TIBTransaction);
が実行され、if分をTRUEで通り
ibtrnTransaction.Commit;
の処理が行われる。

最終的にexceptには入らずに処理は終了する。

正常に動作する場合HData,HDetailテーブルに指定の情報が追加されるが
3.でテーブルを確認するとデータは何も入っていないかった。

以上のような状況で、何を調べればいいのか分からず困っているのですが、
どこを調べればよいでしょうか。
長くなり申し訳ありませんがよろしくお願い致します。


DEKO  2013-05-01 02:45:21  No: 44470

GDS32.DLL は Firebird のもの (FBCLIENT.DLL をリネームしたもの) ですか?
パスが通っている場所に複数の GDS32.DLL が存在していませんか?


igy  2013-05-01 04:13:38  No: 44471

関係ないかも知れませんが、別のPC(PC2)のほうのDelphi7には、最新のアップデートとか適用されていますか?


KHE00221  2013-05-02 04:07:37  No: 44472

>1.PC1でコンパイルしたexe、PC1でのステップ実行する。
>  正常に動作する。
>2.PC1でコンパイルしたexeをPC2で実行する。
>  正常に動作する。
>3.PC2でコンパイルしたexe、PC2でステップ実行する。
>  DBに何も登録されない。

4.PC2でコンパイルしたexeをPC2で実行する。

は?

>※PC2はXP、7 32bit、7 64bitでテスト。

PC1は?


YKK  2013-05-07 20:01:46  No: 44473

返答が遅くなり申し訳ありません。
PC1(正常に動くPC。XP)
PC2(コンパイルすると正常に動かなくなるPC。Windows7 64bit)

>DEKOさん
GDS32.DLLについては恐らくそうだと思います。
PC1のsystem32フォルダ内にあるGDS32.DLLをPC2のSysWOW64フォルダにコピーし、PC1で使用したものと同じインストーラーを使用してFirebird1.5のインストールを行っています。
GDS32.DLLは複数の場所に存在していますが、ライブラリパスが通っている場所には一つもありませんでした。(ファイル保存フォルダ的なところに置いてあるだけ)

>igyさん
どのように確認すればよいでしょうか。
Delphi7のヘルプにあるバージョン情報を開き、DELPHIと書いてある下は
Version 7.0(Build 8.1)となっており、PC1とPC2は同じでした。
しかし下の方の登録キー上の部分は
PC1:Windows XP(Build 2600:Service Pack 3)
PC2:Windows XP(Build 7601:Service Pack 1)
となっていました。

>KHE00221さん
>4.PC2でコンパイルしたexeをPC2で実行する。
を行った際も3.と同じでDBに何も登録されませんでした。
ソフトウェア上では特にエラーの表示は行われていないです。

>PC1は?
PC1はWindows XP Professionalです。書き忘れていました。


take  2013-05-07 20:47:38  No: 44474

5.PC2でコンパイルしたexeをPC1で実行する。
このパターンもチェックすれば、OSなのかコンパイルなのかがわかりそうですが


YKK  2013-05-07 22:14:58  No: 44475

>takeさん
>5.PC2でコンパイルしたexeをPC1で実行する。
を行った場合も3.4.と同様にDBには何も登録されていませんでした。

何かコンパイル環境の問題だとは思うのですが…


igy  2013-05-07 22:44:42  No: 44476

>Delphi7のヘルプにあるバージョン情報を開き、DELPHIと書いてある下は
>Version 7.0(Build 8.1)となっており、PC1とPC2は同じでした。

であれば、

TIBBackupServiceのオプション
https://www.petitmonte.com/bbs/answers?question_id=7982

で、DEKOさんが挙げられてますけど、IBXのバージョンはどちらも同じですか?


YKK  2013-05-07 23:14:44  No: 44477

>igyさん
IBX(IB Console)のバージョンは
Version: 1.0.1.335 JP Fix01
となっておりPC1、PC2共に同じでした

ヘルプのバージョン情報最終行は
PC1:Windows NT 6.1(Build 2600:Service Pack 3)
PC2:Windows NT 6.1(Build 7601:Service Pack 1)
となっていました。


igy  2013-05-07 23:19:17  No: 44478

C:\Program Files\Borland\Delphi7\Source\Vclにある
IBXConst.pas
に、
const
  IBX_Version = 7.xx;
のような記載があると思うのですが、どのようになってますか?


YKK  2013-05-07 23:36:29  No: 44479

>igyさん
確認したところ
PC1:IBX_Version = 7.11;
PC2:IBX_Version = 6;
となっていました。

7.11が恐らくDelphi7のDiscからインストールしたInterbaseだと思いますので、
PC2にDelphi7のディスクからInterbaseをインストールし直してテストしようと思います。


igy  2013-05-07 23:41:39  No: 44480

>PC2にDelphi7のディスクからInterbaseをインストールし直してテストしようと思います。

先に挙げた

TIBBackupServiceのオプション
https://www.petitmonte.com/bbs/answers?question_id=7982

にあるように、

[IBX 7.11 for D7 w/ IB 2007 support]
http://cc.embarcadero.com/item/24267

で、7.11にアップデートすればよさそうな気がします。


YKK  2013-05-08 01:34:43  No: 44481

>igyさん
>[IBX 7.11 for D7 w/ IB 2007 support]
>http://cc.embarcadero.com/item/24267
にあるようにIBXのバージョンを7.11にしたところ正常にDBに登録が行えるようになりました。
ありがとうございます。

ただこのアップデートを行ってから
該当のpasを開こうとすると

フォーム読み込み中のエラー
「クラスTIBClientDataSetが見つかりません。エラーを無視して…」
とエラーが出てしまいます。
通常このエラーをキャンセルを行ってpasを開くと
TIBClientDataSetにカーソルを合わせても定義場所が表示されないはずなのですが、
今回キャンセルを行ってpasを開き、TIBClientDataSetにカーソルを合わせると定義されている場所が正常にポップアップされ、
CTRL+左クリックで定義先のパスが開くようになっていました。(C:\Project\DELPHI7\Lib\DBLocalI.pas)
※C:\Project\DELPHI7\Libにライブラリパスは通してあります。
※コンパイルは正常に行え、作成したexeも正常に動作します。

何故このエラーが出てしまうのでしょうか。


YKK  2013-05-13 19:05:05  No: 44482

IBXを更新した際InterBaseコンポーネントが変更されていたようで
DBLocalI.pasを含むdclibcds.dpkをインストールしたところ
コンポーネントにTIBClientDataSetが追加され正常に動作しました。

皆様ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加