アドバイスくださる方々、いつもありがとうございます。
データベースの重複処理に関して、質問があります。
delphi4 oracle8iを使用しているのですが、データベース上の項目IDにプライマリーキーをかけ、データが重複しないようにしています。insert文でデータを追加するとき、IDが重複しているときは「IDが重複していまので、ほかのIDを入力してください」というメッセージを出し、入力をできないようにしたいのですが、どのようにすればよいでしょうか?また、データが追加された際に、自動的にIDを振り分ける方法をご存知でしょうか?
現在insert文は以下のように、書いています。
begin
with query1 do
begin;
close;
SQL.Clear;
SQL.ADD('insert into TableA (aID, aNAME) values (:value1, :value2)');
prepare;
params...
(省略)
end;
execsql;
end
です。
方法としては、
1.Selectで検索してみる。
2.Insertを発行してエラーが出れば重複している。
begin
with query1 do
begin;
close;
with SQL do
begin
Clear;
ADD('insert into TableA (');
ADD(' aID');
ADD(' , aNAME');
ADD(') values (');
ADD(' :value1');
ADD(' , :value2');
ADD(')');
end;
prepare;
params...
(省略)
// end;
try
execsql;
except //エラーを起こした場合の処理
showmessage('IDが重複しています。');
end
end;
end
HOtaさん、返答ありがとうございます。
begin
with query1 do
begin;
close;
SQL.Clear;
SQL.ADD('insert into TableA (aID, aNAME) values (:value1, :value2)');
prepare;
params...
(省略)
//end;
try
execsql;
except
showmessage('エラー');
end; ← (コロン抜きも試してみました)
end;
end;
としてみたのですが、エラーが生じてもexceptへ入っていきません。すみませんが、アドバイスいただけないでしょうか(try except文はいつもうまくいきません)?
IDEのデバッガオプションで、「Delphi言語の例外で停止」にチェックが入っていれば、外してください。
HOtaさん、チェックをはずしたらうまくいったのですが、理由がよくわからないので、教えていただけないでしょうか?また、私以外で、同じようにDelphi4を使っている方に聞いたら、はずさなくても問題なくtry exceptが実行できると言っていたので、すこし混乱しています。
少し話が違うのですが、oracle8iはsqlplusでテーブルの項目(列)をけすことはできないのでしょうか?alter table A drop(項目);と入力しても、8.1.0.0といってようなエラーが表示され、実行することができません。
sqlplusで実行するとき、
alter table A drop(項目);
最後の;がいらないとおもうけど。
「Delphi言語の例外で停止」はプログラムのエラーを開発環境が停止させてしまいます。その為、プログラムのtry except制御が利かなくなります。
COMPATIBLEパラメータが、8.1.0.0.0以上でないと使用できないエラーではないでしょうか?
HOTAさん、
はい、おっしゃった通りのエラーです。ちなみに、ORA-00406とオラクルのエラー番号がでます。
下記でどうでしょう?
http://okwave.jp/qa/q97191.html?order=&by=
HOtaさん、情報ありがとうございます。問題が解決いたしました。
チェックし忘れていました。
ツイート | ![]() |