tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルDataGridView上からデータベースを変更する方法
記事No9718
投稿日: 2009/12/15(Tue) 14:18
投稿者水の都
Microsoft Visual Studio 2005 SQL SERVER 2008 環境です

DataGridViewで変更した内容をDBに反映したい。
If dRow.RowState <> DataRowState.Unchanged Then で変更した
内容は判定できているようなのですが、DBに反映してくれません
ご教授お願いします

    Private dataset As New DataSet()
    Private olecn As New OleDb.OleDbConnection()
    Private adapter As New OleDb.OleDbDataAdapter()
    Private SQLDA As SqlClient.SqlDataAdapter

Private Sub FORM1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

     GRID_DATA("SELECT * FROM D_MAI")
    
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim MESSAGE As String
        Dim RESULT As Integer

        MESSAGE = "修正した内容を更新しますか?"
        'メッセージボックス
        RESULT = MsgBox(Message, MsgBoxStyle.YesNo Or MsgBoxStyle.Exclamation)

        If RESULT = vbYes Then

            Dim dTbl As DataTable
            Dim dRow As DataRow

            'DataGridからデータソースを取得する
            dTbl = Me.DataGridView1.DataSource

            '編集された行をコミットする
            For Each dRow In dTbl.Rows

                If dRow.RowState <> DataRowState.Unchanged Then
                    
                    
            'Adapterの処理 ↓ ↓ ↓ ↓ ↓ ↓
                  dRow.AcceptChanges()
                        adapter.Update(dataset.Tables("SOURCE"))

                End If
            Next
     End If

End Sub

Private Sub GRID_DATA(ByVal SQL As String)

    Dim strConnectSQL As String
        Dim strSQL As String
        strConnectSQL ="接続設定"
        'SQL構文を指定します。
        strSQL = SQL

        Try
            '接続の設定を行います。
            SQLDA = New SqlClient.SqlDataAdapter(strSQL, strConnectSQL)

            'データセットに格納します。
            SQLDA.Fill(dataset, "SOURCE")

            'データグリッドビューのデータソースを設定
            DataGridView1.DataSource = dataset.Tables("SOURCE")

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

End Sub

[ツリー表示へ]
タイトルRe: DataGridView上からデータベースを変更する方法
記事No9719
投稿日: 2009/12/15(Tue) 15:32
投稿者魔界の仮面弁士
> dRow.AcceptChanges()
> adapter.Update(dataset.Tables("SOURCE"))
AcceptChanges すると、その行のステータスは無変更(Unchaged)になります。
(削除行の場合には行リストから除外され、Deleted から Detached になります)

一方、OleDbDataAdapter.Update(DataTable) メソッドは、変更のあった行を
 DataRowState.Added   (追加) → InsertCommand
 DataRowState.Deleted (削除) → DeleteCommand
 DataRowState.Modified(変更) → UpdateCommand
に割り当てられた SQL で更新する処理です。
(adapter.UpdateCommand.CommandText など)

DataRowState.Unchanged なデータは更新対象にならない事に注意してください。


> For Each dRow In dTbl.Rows
DataAdapter.Update を、行単位で呼び出す必要はありません。
 adapter.Update(dataset.Tables("SOURCE"))
の時点で、複数行の未更新データが一括処理されます。

なお、AcceptChanges を呼び出すとすれば、この更新処理の後です。

AcceptChanges を行うかどうかは任意ですが、追加済みのデータを再度追加してしまうと
キー重複エラーになってしまうでしょうから、更新成功後には
 (案1) dataset.Tables("SOURCE").AcceptChanges() を呼び出すなどして、
   DataTable の各行を Unchaged な状態に戻しておく。
 (案2) サーバーから最新のデータを取得し直す。
 (案3) 更新完了後にデータを再更新できないよう、画面側で制限する。
   (画面を閉じる、DataTableを0件にクリアする、更新ボタンをEnabled=Falseにするなど)
などを行っておく事が多いですね。

[ツリー表示へ]
タイトルRe^2: DataGridView上からデータベースを変更する方法
記事No9721
投稿日: 2009/12/15(Tue) 18:51
投稿者水の都
魔界の仮面弁士様

ご回答ありがとうございます。

> > dRow.AcceptChanges()
> > adapter.Update(dataset.Tables("SOURCE"))
> AcceptChanges すると、その行のステータスは無変更(Unchaged)になります。
> (削除行の場合には行リストから除外され、Deleted から Detached になります

dRow.AcceptChanges() 
を外すと更新ができるようになりました、ありがとうございました。

> > For Each dRow In dTbl.Rows
> DataAdapter.Update を、行単位で呼び出す必要はありません。
>  adapter.Update(dataset.Tables("SOURCE"))
> の時点で、複数行の未更新データが一括処理されます。

adapter.Update(dataset.Tables("SOURCE"))
更新処理はUpdatte行のみとしました

> なお、AcceptChanges を呼び出すとすれば、この更新処理の後です。
>
> AcceptChanges を行うかどうかは任意ですが、追加済みのデータを再度追加してしまうと
> キー重複エラーになってしまうでしょうから、更新成功後には
>  (案1) dataset.Tables("SOURCE").AcceptChanges() を呼び出すなどして、
>    DataTable の各行を Unchaged な状態に戻しておく。
>  (案2) サーバーから最新のデータを取得し直す。
>  (案3) 更新完了後にデータを再更新できないよう、画面側で制限する。
>    (画面を閉じる、DataTableを0件にクリアする、更新ボタンをEnabled=Falseにするなど)

 サーバから最新のデータを取得するようにしました。

 詳細な説明ありがとうございました。
  

[ツリー表示へ]