2016年10月21日

【VB】SqlDataAdapterによる追加・更新・削除


以前、SqlDataAdapterにより抽出したデータをDataGridViewに表示する方法をご紹介しましたが、今回はDataGridViewに表示したデータを変更したり削除したり、または追加して、それをSQL Serverに反映させる方法をご紹介します。

ちなみに、今回も開発ツールは、Visual Studio Community 2015 を使っています。


まず、フォームにこのようにコントロールを貼り付け、下記のように名前を付けてください。

コントロール 名前
DataGridView dgv
Button buttonView
Button buttonOK
Button buttonCancel
Button buttonApply


ソースは下記のようになります。

VB
Imports System.Data.SqlClient

Public Class Form1

    Private Cnn As SqlConnection
    Private Cmd As SqlCommand
    Private InsCmd As SqlCommand
    Private UpdCmd As SqlCommand
    Private DelCmd As SqlCommand
    Private Dta As SqlDataAdapter
    Private Txn As SqlTransaction
    Private Dts As DataSet = New DataSet
    Private cancelFlag As Boolean = False

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim ConnectionString As String = "Data Source=localhost\MSSQLSERVER;Initial Catalog=TESTDB;Integrated Security=True"

        Cnn = New SqlConnection(ConnectionString)
        Cnn.Open()

        Cmd = New System.Data.SqlClient.SqlCommand
        InsCmd = New System.Data.SqlClient.SqlCommand
        UpdCmd = New System.Data.SqlClient.SqlCommand
        DelCmd = New System.Data.SqlClient.SqlCommand
        Dta = New System.Data.SqlClient.SqlDataAdapter

        SetDataSource

        '適用ボタン非活性
        Me.buttonApply.Enabled = False

    End Sub

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing

        Me.Validate()

        Try
            'キャンセルボタンの場合、保存しないで終了。 
            If (cancelFlag = True) Then
                Return
            End If

            If Dts.HasChanges Then

                Dim result As DialogResult
                result = MessageBox.Show("データが変更されています。保存しますか?", "質問", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)

                Select Case (result)
                    Case DialogResult.Yes
                        Apply()
                    Case DialogResult.No

                    Case DialogResult.Cancel
                        e.Cancel = True
                    Case Else
                        e.Cancel = True
                End Select

                Return
            End If

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        Finally
            If (Not (Dta) Is Nothing) Then Dta.Dispose()
            If (Not (DelCmd) Is Nothing) Then DelCmd.Dispose()
            If (Not (UpdCmd) Is Nothing) Then UpdCmd.Dispose()
            If (Not (InsCmd) Is Nothing) Then InsCmd.Dispose()
            If (Not (Cmd) Is Nothing) Then Cmd.Dispose()
            If (Not (Dts) Is Nothing) Then Dts.Dispose()
            If (Not (Cnn) Is Nothing) Then Cnn.Close()
        End Try

    End Sub

    Private Sub dgv_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellValueChanged

        'セルの値が変更されたら適用ボタンを活性化
        Me.buttonApply.Enabled = True

    End Sub

    Private Sub dgv_UserDeletedRow(sender As Object, e As DataGridViewRowEventArgs) Handles dgv.UserDeletedRow

        '行削除が行われたら適用ボタンを活性化
        Me.buttonApply.Enabled = True

    End Sub

    Private Sub buttonView_Click(sender As Object, e As EventArgs) Handles buttonView.Click

        SetDataSource()

    End Sub

    Private Sub buttonOK_Click(sender As Object, e As EventArgs) Handles buttonOK.Click

        'OK
        Apply()
        Me.Close()

    End Sub

    Private Sub buttonCancel_Click(sender As Object, e As EventArgs) Handles buttonCancel.Click

        'キャンセル
        cancelFlag = True
        Me.Close()

    End Sub

    Private Sub buttonApply_Click(sender As Object, e As EventArgs) Handles buttonApply.Click

        '適用
        Apply()
        SetDataSource()
        Me.buttonApply.Enabled = False

    End Sub

    Private Sub Apply()

        Try
            If Dts.HasChanges Then

                'トランザクションを開始
                Txn = Cnn.BeginTransaction

                Dta.UpdateCommand.Transaction = Txn
                Dta.DeleteCommand.Transaction = Txn
                Dta.InsertCommand.Transaction = Txn

                'データ更新
                Dta.Update(Dts, "T_Animals")

                'トランザクションをコミット
                Txn.Commit()
            End If

        Catch
            Txn.Rollback()
            Throw
        Finally
            If (Not (Txn) Is Nothing) Then
                Txn.Dispose()
            End If

        End Try

    End Sub

    Private Sub SetDataSource()

        Try
            'Selectコマンドの作成
            Cmd.Connection = Cnn
            Cmd.CommandType = CommandType.Text
            Cmd.CommandText = "SELECT [ID], [Name], [Type] FROM [T_Animals] ORDER BY [ID]"

            '追加コマンドの作成
            InsCmd.Connection = Cnn
            InsCmd.CommandType = CommandType.Text
            InsCmd.CommandText = "INSERT INTO [T_Animals] ([ID], [Name], [Type]) VALUES (@ID, @Name, @Type)"
            InsCmd.Parameters.Clear()
            InsCmd.Parameters.Add("@ID", SqlDbType.Int, 4, "ID")
            InsCmd.Parameters.Add("@Name", SqlDbType.NVarChar, 50, "Name")
            InsCmd.Parameters.Add("@Type", SqlDbType.NVarChar, 50, "Type")

            '更新コマンドの作成
            UpdCmd.Connection = Cnn
            UpdCmd.CommandType = CommandType.Text
            UpdCmd.CommandText = "UPDATE [T_Animals] SET [ID] = @ID, [Name] = @Name, [Type] = @Type WHERE [ID] = @ID"
            UpdCmd.Parameters.Clear()
            UpdCmd.Parameters.Add("@ID", SqlDbType.Int, 4, "ID")
            UpdCmd.Parameters.Add("@Name", SqlDbType.NVarChar, 50, "Name")
            UpdCmd.Parameters.Add("@Type", SqlDbType.NVarChar, 50, "Type")

            '削除コマンドの作成
            DelCmd.Connection = Cnn
            DelCmd.CommandType = CommandType.Text
            DelCmd.CommandText = "DELETE FROM [T_Animals] WHERE [ID] = @ID"
            DelCmd.Parameters.Clear()
            DelCmd.Parameters.Add("@ID", SqlDbType.Int, 4, "ID")

            If Dts.Tables.Contains("T_Animals") Then
                Dts.Tables("T_Animals").Clear()
            End If

            '各コマンドの設定
            Dta.SelectCommand = Cmd
            Dta.InsertCommand = InsCmd
            Dta.UpdateCommand = UpdCmd
            Dta.DeleteCommand = DelCmd

            '抽出したデータをデータセットに格納
            Dta.Fill(Dts, "T_Animals")

            '列クリア
            Me.dgv.Columns.Clear()

            'DataGridViewのデータソースを設定
            Me.dgv.DataSource = Nothing
            Me.dgv.DataSource = Dts.Tables("T_Animals")

            '適用ボタン非活性
            Me.buttonApply.Enabled = False

        Catch
            Throw
        End Try

    End Sub

End Class


「OK」または「適用」ボタンで変更した内容がデータベースへ反映されます。


C#のソースはこちらをご覧ください。



スポンサーリンク