データベースの重複データ処理

解決


りな  2010-01-05 00:09:03  No: 36718  IP: [192.*.*.*]

アドバイスくださる方々、いつもありがとうございます。
データベースの重複処理に関して、質問があります。

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

です。

編集 削除
HOta  2010-01-05 06:05:23  No: 36719  IP: [192.*.*.*]

方法としては、
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

編集 削除
りな  2010-01-05 21:38:38  No: 36720  IP: [192.*.*.*]

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文はいつもうまくいきません)?

編集 削除
HOta  2010-01-06 14:34:54  No: 36721  IP: [192.*.*.*]

IDEのデバッガオプションで、「Delphi言語の例外で停止」にチェックが入っていれば、外してください。

編集 削除
りな  2010-01-06 22:55:49  No: 36722  IP: [192.*.*.*]

HOtaさん、チェックをはずしたらうまくいったのですが、理由がよくわからないので、教えていただけないでしょうか?また、私以外で、同じようにDelphi4を使っている方に聞いたら、はずさなくても問題なくtry exceptが実行できると言っていたので、すこし混乱しています。

編集 削除
りな  2010-01-06 23:15:26  No: 36723  IP: [192.*.*.*]

少し話が違うのですが、oracle8iはsqlplusでテーブルの項目(列)をけすことはできないのでしょうか?alter table A drop(項目);と入力しても、8.1.0.0といってようなエラーが表示され、実行することができません。

編集 削除
GTR  2010-01-07 12:06:15  No: 36724  IP: [192.*.*.*]

sqlplusで実行するとき、
alter table A drop(項目);
最後の;がいらないとおもうけど。

編集 削除
HOta  2010-01-07 12:26:30  No: 36725  IP: [192.*.*.*]

「Delphi言語の例外で停止」はプログラムのエラーを開発環境が停止させてしまいます。その為、プログラムのtry except制御が利かなくなります。

COMPATIBLEパラメータが、8.1.0.0.0以上でないと使用できないエラーではないでしょうか?

編集 削除
りな  2010-01-07 12:46:34  No: 36726  IP: [192.*.*.*]

HOTAさん、

はい、おっしゃった通りのエラーです。ちなみに、ORA-00406とオラクルのエラー番号がでます。

編集 削除
HOta  2010-01-07 17:13:59  No: 36727  IP: [192.*.*.*]

下記でどうでしょう?
http://okwave.jp/qa/q97191.html?order=&by=

編集 削除
りな  2010-01-09 14:17:33  No: 36728  IP: [192.*.*.*]

HOtaさん、情報ありがとうございます。問題が解決いたしました。

編集 削除
りな  2010-01-09 14:18:18  No: 36729  IP: [192.*.*.*]

チェックし忘れていました。

編集 削除