- - PR -
主キーのないテーブルへのUPDATE
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-12-26 12:35
はじめまして、よろしくお願いいたします。
下記のBで取得しているテーブルには主キーがありません。 たぶん、主キーがないDatatableをUPDATEしようとしてExceptionが発生します。 主キーがないテーブルのデータをUPDATEするにはどうすればいいのでしょうか? 地道にSQLを作成/発行していくしかないのでしょうか? わかる方いたら教えてください。m(__)m なお、以下の方法でODP.NET+ADO.NETでDBからデータを取得しています。 OracleCommand mainCmd = new OracleCommand(strSQL, Cnn); …@ adpSub = new OracleDataAdapter(mainCmd); …A adpSub.Fill(dsSub,tableName); …B で、取得したデータを以下の方法で編集し、更新をかけようとするとCでExceptionが発生しました。 DataRow drCurrent; drCurrent = dsSub.Tables[0].NewRow(); drCurrent["ID"] = txtID.Text; drCurrent["NAME"] = txtName.Text; drCurrent.EndEdit(); OracleCommandBuilder objCommandBuilder = new OracleCommandBuilder(adpSub); adpSub.Update(dsSub,tableName); … C | ||||
|
投稿日時: 2005-12-26 12:51
主キーが無い状態では、何をキーにしてUpdateして良いのかソフトウェアは判断できません。SqlDataAdapter.UpdateCommandプロパティを設定して、Update用のSQL分を提供する必要があるでしょう。
| ||||
|
投稿日時: 2005-12-26 13:10
OracleCommandBuilderがどんなSQLを自動生成してるのか見てみるのも良いかもです。
http://www.atmarkit.co.jp/fdotnet/basics/adonet05/adonet05_03.html | ||||
|
投稿日時: 2005-12-26 14:58
甕星さん、ぼのぼのさん 回答ありがとうございます。
>主キーが無い状態では、何をキーにしてUpdateして良いのかソフトウェアは判断できません。 考えてみればそうですね… キーがわからないのに動的にできるはずないですね。 ちょっと、知識が足りてませんでしたm(__)m 勉強してきます。 | ||||
|
投稿日時: 2005-12-26 15:35
ORACLEであれば
ROWNUMを取得しておき 更新時に WHERE ROWNUM = 更新行のROWNUM としてやればいけるとは思います。 あくまで行が特定できるDB設計を 心がけることが優先されるとは思いますが。 | ||||
|
投稿日時: 2005-12-26 15:56
ROWNUM じゃなくて ROWID だったような・・・。 | ||||
|
投稿日時: 2005-12-26 16:17
ROWIDですねすいません ![]() ROWNUMだと一意に特定される保障ないですね。 ROWNUMが2以上は更新できなかったかも。 しかもソート前に振られますし 使い勝手悪いのでほとんど使ったこと無いです。 ROWIDなら物理アドレスを指定するので 一意に特定できますし、 レスポンスも速いですしね。 主キーを設定するように見直すのが 最も良いとは思いますが・・・ | ||||
|
投稿日時: 2005-12-26 17:29
みなさん、回答ありがとうござますm(__)m
>主キーを設定するように見直すのが そうですよね… ただ、今回開発を行う対象のDBスキーマはすでに確定しているようなので… ちなみに、主キーはないのですが、外部キーはあります。 (外部キーの参照先は、他テーブルの主キーです。) この場合、外部キーが設定されていれば、UPDATEは普通にできるのでしょうか? (まだ未確認なんです…聞いてばかりですいません;) あと、さきほどUpdateCommandを使うとよいとのアドバイスを頂いたのですが、MSDN等で調べてみても、イマイチ仕様が理解できませんした(−−; 主キーのないテーブルのデータを更新するための、簡単なサンプルをご提示していただけると、早めに理解できると思うので、どなたか教えてくださいm(__)m |