Smazání nově vytvořeného zánamu v databázi.   otázka

Algoritmy, Databáze

Dobrý den,

potřeboval bych poradit s následujícím problémem.

Mám DB vytvořenou v Accessu. První pole v tabulce plní funkci ID (primární klíč), které má nastavenou vlastnost Automatické číslo.

Problém nastává při následující sekvenci:

1) vložím nový záznam (btnAddNew_Click)

2) uložím (btnSave_Click)

3) vložený záznam smažu (btnDelete_Click)

4) uložím (btnSave_Click)

Při posledním uložení nastane chyba: "Narušení souběžného zpracování: Událost DeleteCommand ovlivnila 0 z 1 očekávaných záznamů."

    Private m_conn As New OleDb.OleDbConnection()
    Private m_da As OleDb.OleDbDataAdapter
    Private m_cb As OleDb.OleDbCommandBuilder
    Private m_dtKategorie As New DataTable
    Private m_rowPosition As Integer = 0

    Private Sub frmMain_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        m_conn.Close()
        m_conn.Dispose()
    End Sub

    Private Sub ShowCurrentRecord()
        If m_dtKategorie.Rows.Count = 0 Then
            txtName.Text = ""
            Exit Sub
        End If
        txtName.Text = m_dtKategorie.Rows(m_rowPosition)("Name").ToString()
    End Sub

    Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        m_conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Kategorie\Kategorie.mdb"
        m_conn.Open()

        m_da = New OleDb.OleDbDataAdapter("Select * From Kategorie", m_conn)
        m_cb = New OleDb.OleDbCommandBuilder(m_da)
        m_da.Fill(m_dtKategorie)

        Me.ShowCurrentRecord()
    End Sub

    Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
        If m_dtKategorie.Rows.Count <> 0 Then
            m_dtKategorie.Rows(m_rowPosition)("Name") = txtName.Text
            m_da.Update(m_dtKategorie)
        End If

    End Sub

    Private Sub btnAddNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddNew.Click
        Dim drNewRow As DataRow = m_dtKategorie.NewRow()

        drNewRow("Name") = txtNewContactName.Text
        m_dtKategorie.Rows.Add(drNewRow)
        m_rowPosition = m_dtKategorie.Rows.Count - 1
        Me.ShowCurrentRecord()

    End Sub

    Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click

        If m_dtKategorie.Rows.Count <> 0 Then
            m_dtKategorie.Rows(m_rowPosition).Delete()
            m_rowPosition = 0
            Me.ShowCurrentRecord()
        End If

    End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkusím poradit. Nejdříve bych tabulku uloženou v paměti nejdříve synchronizoval s tím co je uloženo v databázi. Takže při každé změně dat bych přidal následující

m_da.Update(m_dtKategorie)

m_dtKategorie.AcceptChanges()

Změny lze poté snad odvolat pomocí "m_dtKategorie.RejectChanges()"

U toho Vašeho mazání totiž dochází, že mažete něco co v tabulce v paměti nevzniklo, protože to nebylo potvrzeno.

Aspoň si to myslím, ale možná se mýlím, protože já to potrvzení změn na rozdíl od Vás používám vždy :-)

Ale snad to pomůže

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji za odpověd. Bohužel Vaše řešení není pro mě použitelné. Mezi vložením a odstraněním nového záznamu může uživatel provádět změny i na jiných záznamech, které musí být zachovány. Ukládání dat provádí uživatel.

Problém jsem vyřešil tím, že po každém uložení znovu naplním DataTable m_da.Fill(m_dtKategorie).

Uvítám jakékoli jiné řešení.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je jedna z možností.

Podstata problému: nesynchronizace primárního klíče v kursoru a odpovídající databázové tabulce. Stává se při použití sloupce

s aut.inkrementací jako PrimaryKey.

Řešení:

1/refill kurzoru po změně v databázové tabuli, viz tvoje řešení

2/zvolit jiný sloupec pro specifikaci uvolnění záznamu, může být

nezobrazovaný z unikátní hodnotou ale takovou, aby se dala

jednoznačně dohledat v databázové tabuli

3/zrušit aut.inkrementaci primárního klíče v databázové tabuli a

ukládat hodnotu klíče synchronně s hodnotou v kurzoru.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback