- PR -

DataSet行削除のDBへの反映

投稿者投稿内容
mover
常連さん
会議室デビュー日: 2004/06/20
投稿数: 47
投稿日時: 2004-08-06 14:53
お世話になります。

VB.NET、SQLServer2000

現状SqlDataAdapter経由で、データベース操作をしています。
新規登録及び、更新に関しては問題なく操作できるのですが、
削除となると、うまくいかない状況に陥ってしまっています。

現状、3つの方法を試したのですが、どれもうまいこといかなくて困っています。
どなたか解決案がありましたら、教えてください。

以下@、Aでは、
「削除された行を通して、その行の情報にアクセスすることはできません」
Bでは、エラーにはならないのでが、DBに反映されない状態になっています。

@
Dim bm As BindingManagerBase = BindingContext(DsData1, "tbl_sample")
bm.CancelCurrentEdit()
bm.RemoveAt(bm.Position)
bm.EndCurrentEdit()
SqlDataAdapter1.Update(DsData1)

A
dataset.Tables("tbl_sample").Rows(grdSample.CurrentCell.RowNumber).Delete()
SqlDataAdapter1.Update(DsData1)

B
Dim cm As CurrencyManager = _
CType(grdSamplef.BindingContext(DsData1, "tbl_sample"), CurrencyManager)
cm.RemoveAt(cm.Position)
cm.Refresh()
SqlDataAdapter1.Update(DsData1)

以上、よろしくお願いいたします。

[ メッセージ編集済み 編集者: リオッタ 編集日時 2004-09-15 17:46 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-06 15:08
引用:

リオッタさんの書き込み (2004-08-06 14:53) より:

以下@、Aでは、
「削除された行を通して、その行の情報にアクセスすることはできません」
Bでは、エラーにはならないのでが、DBに反映されない状態になっています。


 1,3では「削除された〜」で、2はエラーにならないが反映されない、ではないですか?

 BindingManagerBase.RemoveAtは、行データそのものを削除します。したがって、なくなったものにアクセスすることはできません。
 DataRow.Deleteは、RowStateをDeletedに変化させます。こうなると、行の現在の値にはアクセスできなかったと思います。

 Update(DataTable)を使ってみてください。
茄子
会議室デビュー日: 2004/08/06
投稿数: 1
投稿日時: 2004-08-06 16:41
1、2ではデータベースから削除はされているのですよね?
ということは、UpdateのSQLが実行されたあとに、その行の現在値にアクセスしようとするコードがどこかにあるのかもしれませんね。たとえば、DataTable.OnRowChangingなどが発生する場合があるみたいです。
mover
常連さん
会議室デビュー日: 2004/06/20
投稿数: 47
投稿日時: 2004-08-06 17:14
Jittaさん

お世話になります。
早速の返答ありがとうございます。

引用:

1,3では「削除された〜」で、2はエラーにならないが反映されない、ではないですか?



こちらの不備でした。
@ABともにエラーになってました。

現状、UPDATE(DataTable)を使用して作成しています。
※参考書には@の方法を紹介してたんですが、
 確かに行全体を削除してしまったら、アクセスは出来ませんよね^^;


茄子さん

そういう事象もある訳ですね;;
Os_
ベテラン
会議室デビュー日: 2003/04/16
投稿数: 77
投稿日時: 2004-08-07 14:16
Osです。

更新コマンドについて情報が少なく的外れかもしれませんが、
DataTableの削除行にアクセスできないことに起因するのであれば、
以下の方法もあります。

DataTableの削除行を抽出するメソッド

Dim rows() AS DataRow = DataTable.Select(string, string, DataViewRowState.Deleted)

この抽出したDataRow()をUpdateメソッドの引数に設定することが可能です。

以上





えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-08-07 15:13
プロジェクト-新しい項目の追加-データフォームウィザードで出てくるコードを参考にされたらどうでしょうか?

コード:
Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click
    If (Me.BindingContext(objDsData, "部品").Count > 0) Then
        Me.BindingContext(objDsData, "部品").RemoveAt(Me.BindingContext(objDsData, "部品").Position)
        Me.objDsData_PositionChanged()
    End If
End Sub

Public Sub UpdateDataSet()
    Dim objDataSetChanges As VbDataForm.DsData = New VbDataForm.DsData
    Me.BindingContext(objDsData, "部品").EndCurrentEdit()
    objDataSetChanges = CType(objDsData.GetChanges, VbDataForm.DsData)
    If (Not (objDataSetChanges) Is Nothing) Then
        Try
            Me.UpdateDataSource(objDataSetChanges)
            objDsData.Merge(objDataSetChanges)
            objDsData.AcceptChanges()
        Catch eUpdate As System.Exception
            Throw eUpdate
        End Try
    End If
End Sub

Public Sub UpdateDataSource(ByVal ChangedRows As VbDataForm.DsData)
    Try
        If (Not (ChangedRows) Is Nothing) Then
            Me.OleDbConnection1.Open()
            OleDbDataAdapter1.Update(ChangedRows)
        End If
    Catch updateException As System.Exception
        Throw updateException
    Finally
        Me.OleDbConnection1.Close()
    End Try
End Sub


_________________
えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12
えムナウのプログラミングのページ Blog1 Blog2
mover
常連さん
会議室デビュー日: 2004/06/20
投稿数: 47
投稿日時: 2004-08-08 21:28
お世話になります。
たくさんのアドバイスありがたく勉強させてもらっています。

どうしてもエラーが出てしまってるので、
自分のやろうとしてることが間違ってるのではないかと思い、書き込みます。
ご意見アドバイスよろしくお願いします。

現状、作りたい画面として、
ひとつのフォームに一覧と、その一覧に対しての詳細がある画面です。

DataGridの一覧から、レコードをダブルクリック

リストの下部に詳細を表示

更新、新規追加、削除ボタンでデータベースにアクセス
※現状更新、新規追加は問題なく動作している

Webフォームの遷移にあるように、
同一フォーム内に詳細を表示させるのであれば、DataGridでない方がいいのでしょうか?

以上よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-09 08:39
 SqlDataAdapter.RowUpdatingイベントをハンドルして、実行しようとしてるSQL文をデバッグプリントしてみてください。
 Command引数のCommandTextは、パラメータは展開しないので、適切に展開してください。

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