- PR -

主キーのないテーブルへのUPDATE

投稿者投稿内容
未記入
会議室デビュー日: 2005/12/26
投稿数: 10
投稿日時: 2005-12-26 17:58
更新処理の要件と更新対象テーブルの定義がわからないと
サンプルの提示ができないと思います。

strSQLを発行した結果、得られるレコードは一意の1件となるのでしょうか
それとも、複数レコードを取得するのでしょうか?

複数レコードを取得するのであれば、取得したレコードのうち、
更新対象のレコードは、どのような条件で決定するのでしょうか?

取得したレコードのうち、特定の条件に合致するレコードのみを更新したいのでしょうか?
 ・1回の更新処理で更新対象となるレコードは、必ず一意の1件のレコードなのでしょうか?
 ・特定の条件に合致する、複数のレコードを一度に更新したいのでしょうか?

取得したレコードのうち、すべてのレコードを更新したいのでしょうか?
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-12-26 18:32
ADO.NET基礎講座
第5回、第6回あたり。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2005-12-26 22:58
引用:

スラッシュさんの書き込み (2005-12-26 17:29) より:
ちなみに、主キーはないのですが、外部キーはあります。
(外部キーの参照先は、他テーブルの主キーです。)
この場合、外部キーが設定されていれば、UPDATEは普通にできるのでしょうか?
(まだ未確認なんです…聞いてばかりですいません;)



.NETは全然知らないのでDBのとこだけお答えします。

外部キーでは一意であることの保証にはならないです。
主キーまたは非NULLなカラムの一意制約が必要です。

とは言っても、物理的に主キーや一意制約を張ってなくても、
一意になることが確かであればUPDATEは問題ないと思いますよ。
ようは一意になることを誰が(DBMS or アプリ)保証するかです。

#自分じゃ絶対そんな設計はしませんが・・・。
#主キーなしが許せるのは掃き溜めなログくらいかと。

保証できないのであれば、更新時に複数行の更新が起こっても
設計がクソなんだから文句言うな、とクギを刺しておきましょう
noisylambs
会議室デビュー日: 2003/02/25
投稿数: 1
投稿日時: 2005-12-26 23:30
引用:

あと、さきほどUpdateCommandを使うとよいとのアドバイスを頂いたのですが、MSDN等で調べてみても、イマイチ仕様が理解できませんした(−−;
主キーのないテーブルのデータを更新するための、簡単なサンプルをご提示していただけると、早めに理解できると思うので、どなたか教えてくださいm(__)m



http://otn.oracle.co.jp/cgi-bin/non/msgview_r.cgi?communityid=otn-428819&bbsid=1&no=15755&view=9

# 参考になるかどうかは分かりませんが...
extream
ベテラン
会議室デビュー日: 2005/12/26
投稿数: 83
投稿日時: 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/26
投稿数: 10
投稿日時: 2005-12-27 10:52
MSDNライブラリより抜粋

「OracleDataAdapter.UpdateCommand プロパティ」
>この生成ロジックでは、 DataSet 内にキー列情報が存在している必要があります。
>詳細については、「 自動生成コマンド 」を参照してください。

「自動生成コマンド」
>SelectCommand は少なくとも 1 つの主キーまたは一意の列を返す必要があります。
>どちらも存在しない場合は、InvalidOperation 例外が生成され、
>コマンドは生成されません。

====================================================================
selectコマンドが正しく発行できているなら、
selectコマンドで取得したレコードに Update文のWhere句に合致するレコードが
含まれているか、確認してみてはいかがでしょうか?

スキルアップ/キャリアアップ(JOB@IT)