ADO.NETを使用した削除及び更新を行うには?


nyanya  2009-09-08 18:49:50  No: 146299

はじめまして。下記の問題について解決策をお願いします。

■環境
OS:XP SP2
開発環境:VSDE2008(SP1)のVB2008
.NET Framework:3.0
データベース:Access2002でmdb作成

■概要
プロジェクト作成後、フォームにデータテーブルの列の要素をドロップし、
バインディングによりフォームを作成しています。
起動時に入力フォームにデータを入力しBindingNavigatorコントロールにより新規追加/削除/保存を行うプログラムです。

■問題点
新規追加→データを入力→保存
の場合はデータベースは更新されるのですが、

データベースに保存されているデータを編集→保存
の場合は"InvalidOperationExceptionはハンドルされませんでした。
更新には、変更された行を含む DataRow コレクションが渡されたとき、有効な UpdateCommand が必要です。"とエラーになり更新できません。

データベースに保存されているデータを削除→保存
の場合は"InvalidOperationExceptionはハンドルされませんでした。
更新には、変更された行を含む DataRow コレクションが渡されたとき、有効な DeleteCommand が必要です。"とエラーになり更新できません。

■コード
Imports System.Data.OleDb

Public Class CustomerForm
    Dim Adapter As OleDbDataAdapter
    Dim dSet As New DataSet
    Private Sub CustomerForm_Load(ByVal sender As System.Object,     ByVal e As System.EventArgs) Handles MyBase.Load
       
        Dim strSQL As String = "SELECT * From customer"
        Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0/以下省略)
        Adapter = New OleDbDataAdapter(strSQL, Cn)
        Dim cBld = New OleDb.OleDbCommandBuilder(Adapter)
        Me.CustomerTableAdapter.Fill(Me.OrderDataSet.customer)
     End Sub

    Private Sub BindingNavigatorMoveFirstItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles             BindingNavigatorMoveFirstItem.Click
        CustomerBindingSource.MoveFirst()
    End Sub

    Private Sub BindingNavigatorMovePreviousItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorMovePreviousItem.Click
        CustomerBindingSource.MovePrevious()
    End Sub

    Private Sub BindingNavigatorMoveNextItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorMoveNextItem.Click
        CustomerBindingSource.MoveNext()
    End Sub

    Private Sub BindingNavigatorMoveLastItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorMoveLastItem.Click
        CustomerBindingSource.MoveLast()
    End Sub

    Private Sub BindingNavigatorAddNewItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorAddNewItem.Click
        CustomerBindingSource.AddNew()
    End Sub

    Private Sub BindingNavigatorDeleteItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorDeleteItem.Click
        If MsgBox("削除してもよろしいですか", MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2) = MsgBoxResult.Yes Then
            CustomerBindingSource.RemoveCurrent()
        End If
    End Sub

    Private Sub CustomerBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CustomerBindingNavigatorSaveItem.Click, Me.FormClosing
        Me.Validate()
        If HandleInputError() = False Then
            If TypeName(e) = "FormClosingEventArgs" Then
                DirectCast(e, FormClosingEventArgs).Cancel = True
            End If
            Return
        End If
        Me.CustomerBindingSource.EndEdit()
        Me.TableAdapterManager.UpdateAll(Me.OrderDataSet)
    End Sub

■データベースファイル
order.mdb
商品テーブル
id name address phoneの4列 

idが主キーでオートナンバーに設定してます。


特攻隊長まるるう  2009-09-12 04:11:36  No: 146300

CommandBuilder 使ってるみたいだし。。。
まぁ、エラーメッセージを信じて UpdateCommand と DeleteCommand に自動生成されている
であろう SQL 文の確認から調査開始といったところですかね。
同様の現象でも幾つか違う原因が報告されています。ネット上をエラーメッセージで検索して
みてください。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加