- PR -

OleDbDataAdapterを使用したDB更新

投稿者投稿内容
kazu
会議室デビュー日: 2005/07/28
投稿数: 9
投稿日時: 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
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-07-29 05:41
 DataRow.RowState を見て、modified, deleted の行があるか、確認してください。これらがなければ実行されませんから。

 OleDbDataAdapter.Updating イベントをハンドリングして、どのコマンドが実行されているか、ウォッチしてみてください。
_________________
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-07-29 10:37
クロスサイトポストリンク。

OleDbDataAdapterを使用したDB更新



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
kazu
会議室デビュー日: 2005/07/28
投稿数: 9
投稿日時: 2005-07-29 12:38
大変失礼いたしました。
誤って2重投稿してしまいました。
せっかくご丁寧にお答えいただいたJitta様、じゃんぬ様、並びに皆様に不快な思いをさせてしまい、大変申し訳ございませんでした。
今後は二度とこのような事がないように留意いたします。
これからも宜しくお願い致します。


Jitta様お答えいただきありがとうございました。

InsertとUpdate、Deleteでコードは同じでも結果が異なるのはなぜなのでしょうか。
宜しくお願い致します。
kazu
会議室デビュー日: 2005/07/28
投稿数: 9
投稿日時: 2005-07-29 14:39
引用:

Jittaさんの書き込み (2005-07-29 05:41) より:
 DataRow.RowState を見て、modified, deleted の行があるか、確認してください。これらがなければ実行されませんから。




確認してみたとこと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 ]
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2005-07-29 15:52
引用:

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.Update(dt)

myConnString.Close()
End Function



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サンプル集
kazu
会議室デビュー日: 2005/07/28
投稿数: 9
投稿日時: 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)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-07-29 22:07
 まず、訂正。『OleDbDataAdapter.Updating イベント』は誤りでした。『OleDbDataAdapter.RowUpdating イベント』が正解です。


> DataTableが空のためかとおもい、
 (・_・;何をしようとしていたの?


> とすれば削除はできますが、これですとOleDbDataAdapterの
> DeleteCommandを使用していないように思えます。
 なぜですか?DataRow.Delete メソッドの説明を読めばわかることですが、これは“データベースからは”削除しません。「この行は削除します」とマークするだけです。したがって、削除もされていません。削除されていないので、削除を取り消すことができます。

…なんとなく、どう間違って解釈しているのか、解ってきた。解ってきたけど、どう説明したらいいのか判んないや。。。


 Fill メソッドで SelectCommand を使ってデータベースから取得し、挿入、削除、変更を行い、Update メソッドで、それぞれの行の RowState によって DeleteCommand, InsertCommand, UpdateCommand が使われてデータベースに反映される。

こういう流れになるようにしてください。

_________________

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