- - PR -
主キーのないテーブルへのUPDATE
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-12-26 17:58
更新処理の要件と更新対象テーブルの定義がわからないと
サンプルの提示ができないと思います。 strSQLを発行した結果、得られるレコードは一意の1件となるのでしょうか それとも、複数レコードを取得するのでしょうか? 複数レコードを取得するのであれば、取得したレコードのうち、 更新対象のレコードは、どのような条件で決定するのでしょうか? 取得したレコードのうち、特定の条件に合致するレコードのみを更新したいのでしょうか? ・1回の更新処理で更新対象となるレコードは、必ず一意の1件のレコードなのでしょうか? ・特定の条件に合致する、複数のレコードを一度に更新したいのでしょうか? 取得したレコードのうち、すべてのレコードを更新したいのでしょうか? | ||||
|
投稿日時: 2005-12-26 18:32
ADO.NET基礎講座
第5回、第6回あたり。 | ||||
|
投稿日時: 2005-12-26 22:58
.NETは全然知らないのでDBのとこだけお答えします。 外部キーでは一意であることの保証にはならないです。 主キーまたは非NULLなカラムの一意制約が必要です。 とは言っても、物理的に主キーや一意制約を張ってなくても、 一意になることが確かであればUPDATEは問題ないと思いますよ。 ようは一意になることを誰が(DBMS or アプリ)保証するかです。 #自分じゃ絶対そんな設計はしませんが・・・。 #主キーなしが許せるのは掃き溜めなログくらいかと。 保証できないのであれば、更新時に複数行の更新が起こっても 設計がクソなんだから文句言うな、とクギを刺しておきましょう | ||||
|
投稿日時: 2005-12-26 23:30
http://otn.oracle.co.jp/cgi-bin/non/msgview_r.cgi?communityid=otn-428819&bbsid=1&no=15755&view=9 # 参考になるかどうかは分かりませんが... | ||||
|
投稿日時: 2005-12-27 09:52
返事遅れてすいませんm(__)m
2ページ目があるの知りませんでした… >strSQLを発行した結果、得られるレコードは一意の1件となるのでしょうか >それとも、複数レコードを取得するのでしょうか? 両方のパターンが存在します。 一応、取得対象のテーブルには、ユニーク制約で必ずユニークになるフィールドの組み合わせがあります。 今は、複数レコードの場合ではなく、データが一件の場合を検討していました。 (1件の更新ができないのに、N件の処理なんて考えられないので…) なお、対象が1件の場合は、ユニーク制約があるフィールドはデータ更新の対象ではありません。 N件の場合は、ユニーク制約のフィールドがデータ更新の対象となります。 (簡単に言うと、データのINDEX番号だけを入れ替えます。) 説明が下手で申し訳ありませんm(__)m 今のところ、SQLをゴリゴリって作ってOracleCommandオブジェクトで実行しています。 ただ、せっかくADO.NET使っているのだから、ADO.NETの機能を有効に使ってデータの更新がしたいなと思い、皆様にお聞きしている次第です。。。 #MSDNの例文のようにUpdateCommandを使ってみたんですが、DBに反映されませんでした。 ↓ ↓ ↓ string sql = MakeSQL();//UPDATE文作成 OracleDataAdapter adp = new OracleDataAdapter(); adp.SelectCommand = mainCmd; mainCmd = new OracleCommand(sql,Cnn); /パラメータ設定 mainCmd.Parameters.Add("@id", OracleDbType.Int32,9,ID); mainCmd.Parameters.Add("@name", OracleDbType.Varchar2,256,Name); mainCmd.Parameters.Add("@job", OracleDbType.Varchar2,256,Job); adp.UpdateCommand = mainCmd;//ここでコマンドをセットすれば、SQLが実行される??? ↑ ↑ ↑ ちなみに、データSELECT時のアダプタと、UPDATE時のアダプタは別にしています。 (同じアダプタを使った場合も試しましたが、DBに結果が反映されませんでした。) mainCmdは、SELECT時に使用したオブジェクトを、UPDATE時も使用しています。 | ||||
|
投稿日時: 2005-12-27 10:52
MSDNライブラリより抜粋
「OracleDataAdapter.UpdateCommand プロパティ」 >この生成ロジックでは、 DataSet 内にキー列情報が存在している必要があります。 >詳細については、「 自動生成コマンド 」を参照してください。 「自動生成コマンド」 >SelectCommand は少なくとも 1 つの主キーまたは一意の列を返す必要があります。 >どちらも存在しない場合は、InvalidOperation 例外が生成され、 >コマンドは生成されません。 ==================================================================== selectコマンドが正しく発行できているなら、 selectコマンドで取得したレコードに Update文のWhere句に合致するレコードが 含まれているか、確認してみてはいかがでしょうか? |