- - PR -
OleDbDataAdapterを使用したDB更新
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-07-28 19:45
はじめまして、いつも参考にさせてもらっています。
OleDbでオラクルDBに接続しています。 OleDbDataAdapterを使用しDBを更新しようと思い以下のコードを書きました。 実行するとエラーにはならず正常終了するのですが更新がされていません。 Select、Insert、Update、Deleteを作成しましたがSelect、Insertは成功しましたが、Update、Deleteは更新できませんでした。(まったく変化無しでした。) Insertは以下のコードのUpdateCommandをInsertCommand変えたものでうまくいったのでUpdate、Deleteもいけるかと思ったのですがだめでした。 どこがいけないのかわかりませんので、分かる方教えてください。宜しくお願い致します。 Public Function Update(ByVal text1 As String, ByVal text2 As String, ByVal text3 As String, ByVal text4 As String, ByRef custDA As OleDbDataAdapter) As DataTable Dim myConnString As New OleDbConnection("Provider=MSDAORA.1;Data Source=・・・;User Id=・・・;Password=・・・;") custDA = New OleDbDataAdapter Dim dt As New DataTable Dim cmdUpd As OleDbCommand cmdUpd = New OleDbCommand("UPDATE TableName SET Col3 = ?, Col4 = ?, 更新日時 = SYSDATE WHERE Col1 = ? AND Col2 = ?", myConnString) cmdUpd.Parameters.Add("@Col3", OleDbType.VarChar, 1) cmdUpd.Parameters.Add("@Col4", OleDbType.VarChar, 1) cmdUpd.Parameters.Add("@Col1", OleDbType.VarChar, 3) cmdUpd.Parameters.Add("@Col2", OleDbType.VarChar, 5) custDA.UpdateCommand = cmdUpd custDA.UpdateCommand.Parameters("@Col3").Value = text3 custDA.UpdateCommand.Parameters("@Col4").Value = text4 custDA.UpdateCommand.Parameters("@Col1").Value = text1 custDA.UpdateCommand.Parameters("@Col2").Value = text2 custDA.Update(dt) myConnString.Close() End Function | ||||
|
投稿日時: 2005-07-29 05:41
DataRow.RowState を見て、modified, deleted の行があるか、確認してください。これらがなければ実行されませんから。
OleDbDataAdapter.Updating イベントをハンドリングして、どのコマンドが実行されているか、ウォッチしてみてください。 _________________ | ||||
|
投稿日時: 2005-07-29 10:37
クロスサイトポストリンク。
OleDbDataAdapterを使用したDB更新 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2005-07-29 12:38
大変失礼いたしました。
誤って2重投稿してしまいました。 せっかくご丁寧にお答えいただいたJitta様、じゃんぬ様、並びに皆様に不快な思いをさせてしまい、大変申し訳ございませんでした。 今後は二度とこのような事がないように留意いたします。 これからも宜しくお願い致します。 Jitta様お答えいただきありがとうございました。 InsertとUpdate、Deleteでコードは同じでも結果が異なるのはなぜなのでしょうか。 宜しくお願い致します。 | ||||
|
投稿日時: 2005-07-29 14:39
確認してみたとことUnchangedとなっていたため実行していないようです。 DataTableが空のためかとおもい、SelectをUpdateの前に行いFillをしてDataTableに値を入れ実行してみたのですが、実行されませんでした。 Deleteの場合は For i As Integer = 0 To dt.Rows.Count - 1 dt.Rows(i).Delete() Next とすれば削除はできますが、これですとOleDbDataAdapterのDeleteCommandを使用していないように思えます。 Insert、Update、Deleteではそれぞれ違った書き方(InsertCommand、UpdateCommand、DeleteCommandとSQL以外で)が必要なのでしょうか。 何が間違っているのでしょうか。 ご教授ください。宜しくお願い致します。 [ メッセージ編集済み 編集者: kazu 編集日時 2005-07-29 14:57 ] [ メッセージ編集済み 編集者: kazu 編集日時 2005-07-29 14:59 ] | ||||
|
投稿日時: 2005-07-29 15:52
DataAdapterのUpdateメソッドでTableTable上で変更されたレコードがデータベースに反映されるようにします。 cmdUpd.Parameters.Add("@Col3", OleDbType.VarChar, 1,"FieldName3") cmdUpd.Parameters.Add("@Col4", OleDbType.VarChar, 1,"FiledName4") のように、DataTableのフィールド名を指定します。 なお、Where句のパラメータ変数には、SourceVersionにDataRowVersion.Originalを 設定して変更前のフィールド値が代入されるようにします。 _________________ ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集 | ||||
|
投稿日時: 2005-07-29 18:30
Access様お答えありがとうございます。
ご指摘のとおり以下のようにカラム名を追加し、SourceVersionをOriginalにしましたが、やはり更新されませんでした。 RowStateはUnchangedのままで、いろいろ調べてみたところcustDA.Update(dt)後でも DataTable自体が更新されていませんでした。 更新のためのコマンドが足りないのでしょうか。 引き続きご教授ください。宜しくお願い致します。 Dim cmdSel As OleDbCommand cmdSel = New OleDbCommand("SELECT * FROM TableName WHERE col1 = ? AND col2 = ?", myConnString) cmdSel.Parameters.Add("@col1 ", OleDbType.VarChar, 3) cmdSel.Parameters.Add("@col2", OleDbType.VarChar, 5) custDA.SelectCommand = cmdSel custDA.SelectCommand.Parameters("@col1 ").Value = text1 custDA.SelectCommand.Parameters("@col2").Value = text2 custDA.Fill(dt) Dim cmdUpd As OleDbCommand cmdUpd = New OleDbCommand("UPDATE TableName SET col3 = ?, col4 = ?, 更新日時 = SYSDATE WHERE col1 = ? AND col2 = ?", myConnString) cmdUpd.Parameters.Add("@col3", OleDbType.VarChar, 1, "col3") cmdUpd.Parameters.Add("@col4", OleDbType.VarChar, 1, "col4") cmdUpd.Parameters.Add("@col1", OleDbType.VarChar, 3, "col1 ").SourceVersion = DataRowVersion.Original cmdUpd.Parameters.Add("@col2", OleDbType.VarChar, 5, "col2").SourceVersion = DataRowVersion.Original custDA.UpdateCommand = cmdUpd cmdUpd.Parameters("@col3").Value = text3 cmdUpd.Parameters("@col4").Value = text4 cmdUpd.Parameters("@col1").Value = text1 cmdUpd.Parameters("@col2").Value = text2 Dim drState As DataRowState For i As Integer = 0 To dt.Rows.Count - 1 drState = dt.Rows(i).RowState Next custDA.Update(dt) | ||||
|
投稿日時: 2005-07-29 22:07
まず、訂正。『OleDbDataAdapter.Updating イベント』は誤りでした。『OleDbDataAdapter.RowUpdating イベント』が正解です。
> DataTableが空のためかとおもい、 (・_・;何をしようとしていたの? > とすれば削除はできますが、これですとOleDbDataAdapterの > DeleteCommandを使用していないように思えます。 なぜですか?DataRow.Delete メソッドの説明を読めばわかることですが、これは“データベースからは”削除しません。「この行は削除します」とマークするだけです。したがって、削除もされていません。削除されていないので、削除を取り消すことができます。 …なんとなく、どう間違って解釈しているのか、解ってきた。解ってきたけど、どう説明したらいいのか判んないや。。。 Fill メソッドで SelectCommand を使ってデータベースから取得し、挿入、削除、変更を行い、Update メソッドで、それぞれの行の RowState によって DeleteCommand, InsertCommand, UpdateCommand が使われてデータベースに反映される。 ↑ こういう流れになるようにしてください。 _________________ |
1|2|3
次のページへ»