Oracle接続

解決


やっほ〜  2012-12-28 19:35:49  No: 43580

こんにちは!
Delphi初心者です。
[環境]
Windows XP Pro
Delphi7
Oracle10g
*****************
以上の環境でOracleデータベースを利用したアプリを開発しています。
雷などでネットワークカードやLAN回線に障害が発生した場合を考慮した
アプリを考えています。
障害があり、Oracleに接続できない場合、現在はOracl接続エラーの
Windowが表示されます。
そのWindowを表示させず、Oracle接続ができているか
判断し、できない場合はローカルのデータベースに書き込む
処理をしたいのですが、できますでしょうか?
年の瀬も押し迫り、お忙しいところ申し訳ありませんが、
ご教授お願い致します。


ありい  2012-12-29 02:04:39  No: 43581

やっほ〜さん、こんにちは。
ざっくりと、以下の感じになると思います。

// con: コネクションのオブジェクト
// ネットワーク接続のパラメータセット
try
  con.Open;
except
  // 接続に失敗したのでローカルに接続

  // ローカル接続のパラメータセット
  con.Open;
end;


やっほ〜  2012-12-29 19:05:34  No: 43582

ありいさん、ご回答ありがとうございます。
おっしゃる通りコーディングしたところ、思うような
処理ができました。本当に助かりました。
ありがとうございます。
もうひとつ、ご質問なのですが、
このデータベースアプリを起動した際に、
同様に雷などでネットワークカードやLAN回線に障害が発生した場合を考慮した時、「ORA-12560:TNSプロトコルアダプタエラーが発生しました」
というエラーが発生してますが、
最初のご質問同様、、Oracle接続ができているか
判断し、できない場合はローカルのデータベースに書き込む
処理をしたいのですが、できますでしょうか?
ずうずうしく、再度のご質問をしてしまい
申し訳ありませんがよろしくお願い致します。


HOta  2012-12-31 19:57:43  No: 43583

ローカルのデータベースも同じOracleなら、そのままで出来ます。


やっほ〜  2013-01-01 03:58:36  No: 43584

HOtaさんお返事ありがとうございます。
ローカルのデータベースはAccessを利用しています。


HOta  2013-01-03 18:17:29  No: 43585

この場合は、必要なテーブルをサーバーとローカルに持ち、一時ファイルとしてAccessに保存しておき、回線が回復したときに、サーバーに登録する仕組みが必要でしょうね。
このあたりは、ロジックをじっくりと考えましょう。


やっほ〜  2013-01-05 01:46:46  No: 43586

HOtaさん、年始のごくつろぎの日に?
ご回答ありがとうございます。
なにやら、初心者の私には難問のようですが
頑張ってみます。


やっほ〜  2013-01-05 01:46:48  No: 43587

HOtaさん、年始のごくつろぎの日に?
ご回答ありがとうございます。
なにやら、初心者の私には難問のようですが
頑張ってみます。


ありい  2013-01-05 04:42:31  No: 43588

やっほ〜さん、こんばんは。

必須要件でなければ「ORA-12560:TNSプロトコルアダプタエラーが発生しました」が発生した時点でアプリを再起動して貰うなりした方が楽だと思います(^^;

どうしてもやるとすれば、最初の構文と同じようにtry 〜 exceptで最初にOracleに書き込み、失敗時はAccessに書き込み、などが考えられます。

#そして次はOracleに繋がらなくなりAccessに書いて、その後にOracle(や回線)が復活したらどうするの?...という話に進む気がします。
すると今度は復活を監視しないといけなくなり、またハードルが上がるし復旧時のデータの整合性をどうするとか、色々と面倒です。

#そのぐらいなら最初からAccess前提に作成して、プログラム起動時・終了時にOracleに読み込み・書き込みに行く方が楽な気がします(^^;  やっほ〜さんの要件が許せば、ですが。

以上、ご参考まで m(__)m


やっほ〜  2013-01-05 05:31:54  No: 43589

あいりさん、ご回答ありがとうございます。
プログラム起動時(FormのActionイベント)には、
Oracle接続するコーディングにはなってませんが、
エラーが発生します。
どの部分にtry〜exceptを入れれば、良いのでしょうか?


HOta  2013-01-05 21:47:17  No: 43590

Actionで何をしているか?どんなエラーがでているか?
を書き込んでください。


やっほ〜  2013-01-07 18:00:39  No: 43591

HOtaさん、詳しく書き込まず申し訳ありませんでした。
FormActivateイベントの内容は以下の通りです・
*****************************
procedure TrmMenu.ormActivate(Sender: TObject);
begin
  if ileSearch('Sample.txt', 'C:\') = '' then
  begin
    Memo1.Text := 'IDマスターが存在しません!';
  end;
end;

以上です。
お手数おかけしますが、ご教授お願い致します。


ありい  2013-01-07 21:51:46  No: 43592

やっほ〜さん、こんにちは。

#HOtaさん、フォローありがとうございます m(__)m

  FormActivateでのエラー内容が書かれていませんが、多分コンパイルエラーですね。

>  if ileSearch('Sample.txt', 'C:\') = '' then

if FileSearch('Sample.txt', 'C:\') = '' then
   ~

  私が前回書いたのは「DB書き込み(更新)時に」try 〜 except で処理してはどうでしょうか?ということです。

  やっほ〜さんの質問内容と、書かれているコードの内容が一致していないので、現状のままではやっほ〜さんも回答者も混乱するだけだと思います。

  質問用に別途プロジェクトを作成してDBの挙動のみにコードを減らして動作を確認した方が、やっほ〜さんの理解も進むと思いますので検討してみて下さい。


やっほ〜」  2013-01-07 22:54:43  No: 43593

HOtaさん、ありさん、お返事ありがとうございます。
エラー内容書き忘れました。
新年早々、またやってしまいました。
コンパイルエラーではなく、EXEを実行すると
「ORA-12560: プロトコル・アダプタ・エラーG発生しました。」と
いうウィンドウがでます。


HOta  2013-01-08 04:18:12  No: 43594

このエラーはOracleのエラーですね。
環境変数が正しく設定できていないらしいですよ。


やっほ〜  2013-01-08 09:08:58  No: 43595

HOtaさん、ご回答ありがとうございます。
環境変数とは、どこで設定するのでしょうか?


ありい  2013-01-08 20:55:04  No: 43596

やっほ〜さん、こんにちは。

  例えば同じPCでSQLPlusでOracleに繋げる事はできますか?  もし繋がらないならばOracleの設定の問題で、Delphiとは何の関係もありません。

  もしSQLPlusで繋がるなら、Connectionの設定を見直して下さい。

> おっしゃる通りコーディングしたところ、思うような
> 処理ができました。本当に助かりました。

  この時点までは繋がっていたのではないですか?  この後に繋がらなくなったとしたら、その後にやっほ〜さんが弄った所に問題がある可能性が高いです。

  前にも書きましたが、質問する際には問題の特定を容易にするため、別プロジェクトを作成してテストすることを「強く」お勧めします。


HOta  2013-01-08 22:36:33  No: 43597

ORA-12560:でWeb検索すると、いろいろ出ます。
http://www.shift-the-oracle.com/oerrs/ora-12560.html
にいろいろ載っています。こんなところは見ましたか?


やっほ〜  2013-01-09 06:57:48  No: 43598

HOtaさん、あいりさんご回答ありがとうございます。
ネットワーク回線が正常の時は、問題なくOracle接続はできています。
今回、何らかの障害で(例えば、NIC障害やネットワーク回線障害など)
Oracle接続ができなかった場合を想定して、
アプリケーションを起動した時に、それを判別して
接続ができない場合は、他の処理を行いたいのですが・・・
知識不足と説明不足の為、お伝えしたいことが伝わらないかもしれません。


Mr.XRAY  2013-01-09 20:47:18  No: 43599

こんにちは.
ちょっと横からよろしいでしょうか.

>今回、何らかの障害で(例えば、NIC障害やネットワーク回線障害など)
>Oracle接続ができなかった場合を想定して、

何回も同じようなことを書いていますが,
このことは,貴方の発言を読んでいる方は,十分分かっていると思いますよ.
どなたかが書いていますが,具体的な状況が不明ですので,これ以上は,
エスパーでもない限り,解決策を見出すのは困難だと思います.

私もネットワーク上,組織内ののサーバ,インターネット接続 (Oracle だったりします)
のデータベースに接続していますが,
ネットワークの接続状況を判定し,その後で,データベースの接続状況のチェックを
しています.

しかしです.例えば,
[570][01_TADOTable だけで設計時に設定]
http://mrxray.on.coocan.jp/Delphi/plSamples/570_ADO_JETDB.htm#01

のように,設計時に接続の設定してしまうと,これらのチェックはできません.
ネットワークの接続がない場合でも,データベース接続のエラーが発生してしまいます.

>ローカルのデータベースはAccessを利用しています。

こういう環境等を後出しするのではなく,自分の状況をまず把握することが
大切ではないかと思います.

>知識不足と説明不足の為、お伝えしたいことが伝わらないかもしれません。

知識不足ということではなく,状況の把握と,その記述がないだけではないでしょうか.
丁寧な言葉を使う必要はないと思いますよ.この掲示板でレスする人の中に「教授」できる
人はほとんどいないと思います (失礼 !!).
お互いに向き合っての会話であれば,

「ネットワークのデータベースがつながらないんだよね.オラクルなんだけど」
「ネットワークはどうなってんの,接続できてんの ?
  データベースの接続はどんなコードなの ?」
「何万行のあるコードなので,簡単には説明できないよ」
「でも,接続だけのテストだったら,新規のプロジェクトを作成してテストできないの ?」
「Q and A で訊いたんだけど,ネットワークがつながっている時は OK と言っているのに,
  誰も分かってくれないんだよな.中には Mr.XRAY というのがいて,発言にケチつけんだよね」
  
というように,進めていけますが,掲示板ではそうはいかないですからね.


やっほ〜  2013-01-17 08:30:24  No: 43600

皆様、そしてMr.XRAYさん、ご回答ありがとうございました。
ご指摘いただきまたように、サンプルをプログラムを
色々作り、試しましたところ
ようやく出来ました。
本当に助かりました。
今後ともご指導お願いします。


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

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






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