Chybová hláška   zodpovězená otázka

VB.NET, Databáze

Dobrý den,

používám ve VB toto:

SeznamBS.RemoveAt(0)

SeznamTA.Update(Me.DataDS)

Toto však skončí chybovou hláškou: Metoda Update vyžaduje při předání kolekce DataRow s odstraněnými řádky platnou událost DeleteCommand.

Nemůžete někdo poradit jak to udělat, aby se pomocí BindingSource a TableAdapter vymazal řádek (položka) v databázi?

Našel jsem tu na to několik dotazů, ale žádnou odpověď.

Děkuji

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

Asi budete muset použít jiný způsob, např vlastní SQL dotaz...

Mám podobný problém už od VS2012Express, teď i ve verzi 2013Express, musel jsem to řešit SQL dotazem

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

Bohužel, SQL moc nerozumím. I kdybych sestavil dotaz, tak nevím jak ho do databáze předat. Například u filtrování zadám dotaz přes BindingSource.Filter, ale netuším kde a jak dát dotaz na vymazání položky. Nebyl by nějaký jednoduchý příklad?

Děkuji

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

Například takto se dají uložit veškeré změny v DGV za předpokladu, že v prvním sloupci (může být i skrytý) je ID jednotlivých záznamů:

Private Sub btnUlozit_Click(sender As Object, e As EventArgs) Handles btnUlozit.Click

        'Uložit změny v DGV
        Dim pocrad As Integer = DataGridView.RowCount - 1   'počet záznamů, protože první řádek má číslo 0

        For r As Integer = 0 To pocrad
            Try
                oledbcon.Open()                      'Otevřít spojení s databází
                Dim strZmen As New OleDbCommand("UPDATE [tabulka] SET [SloupecNazev] = '" & DataGridView.Rows(r).Cells(1).Value & "' WHERE [SloupecId] LIKE '" & DataGridView.Rows(r).Cells(0).Value & "'", oledbcon)                  strZmen.ExecuteNonQuery()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            Finally
                oledbcon.Close()
            End Try
        Next

        'Znovu načíst data do DGV
        Me.TableAdapter.Fill(Me.DataSet1.tabulka)
    End Sub
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Princip jsem asi pochopil, ale nefunguje mi to, protože mi chybí nadefinování oledbcon a oledbcommand. :(

Já používám k propojení s databází BindingSource, takže nevím jak to nadefinovat.

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

Uff, je těžké něco dělat a řešit, když neznáte bohužel základy (jak SQL, tak OOP)- doporučil bych se vrátit k těmto základům, aby pro Vás další budoucí aplikace byly po této stránce jasnější a nepsal jste kód, kterému naprosto nerozumíte a jen jej kopírujete (takto nikdy dobrá aplikace, ani programátor nevznikne).

Osobně mi nepřijde ani navržený postup (manuální update) jako rozumný, navíc uvedený kód je dost nepěkně napsaný (žádný pooling, using/with, atd.).

Návod jak na to najdete např. na http://msdn.microsoft.com/en-us/library/... - tudíž nevěřím tomu, že jste na netu nic nenašel.

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

Děkuji za odpověď, koukl jsem se na ten příklad a zkusil ho použít. BindigSource, TableAdapter a databázi jsem nahradil svýma, ale dopadl jsem úplně stejně:


Try
    Me.Validate()
    Me.CustomersBindingSource.EndEdit()
    Me.CustomersTableAdapter.Update(Me.NorthwindDataSet.Customers)
    MsgBox("Update successful")
Catch ex As Exception
    MsgBox("Update failed")
End Try

U EndEdit a Customers mi to vykazuje chybu: "is not a member of 'WindowsApplication1.NorthwindDataSet'".

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

Vy ale nemáte dataset s názvem NorthwindDataSet, podle toho prvního příspěvku soudím, že Váš dataset se jmenuje DataDS

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

To je přesně to, o čem hovoří předchozí reakce některého z přispěvatelů => zkopíroval jste kód téměř 1:1 a divíte se, že nefunguje - naučte se kódu rozumět a psát jej, ne pouze kopírovat. Neberte to jako rýpání nebo nezmar, ale jako dobrou radu, pokud chcete vážně a "dobře" programovat.

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

Já jsem sem zkopíroval text tak jak byl v tom návodu a proto jsem napsal NorthwindDataSet. Samozřejmě, že jsem si to upravil. Konkrétně jsem měl místo CustomerBindingSource SeznamBS, místo CustomerTableAdapter jem měl SeznamTA a místo NorthwindDataSet jsem měl DataDS. U EndEdit je to v pořádku, tam jsem měl chybu, ale u Datasetu mi to nebere to Customers a hlásí to tu chybu "'Customers' is not a member of 'WindowsApplication1.DatabázeDataSet'.".

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

Vždyť Vám ta chybová hláška říká, co máte špatně. Ve Vaší aplikaci není tabulka s názvem Customers

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

Díky, já anglicky moc neumím, tak mi nedošlo, že je to tabulka. Nicméně po použití onoho příkladu to opět zhavaruje na Update s chybovou hláškou "Metoda Update vyžaduje při předání kolekce DataRow s odstraněnými řádky platnou událost DeleteCommand.", takže jsem zase na začátku.

Pro jistotu sem dám celý kód k vymazání řádku v databázi, jestli někdo tu chybu nenajdete:

Dim Radek As Integer = SeznamDGV.CurrentCellAddress.Y 'zjistím vybraný řádek v Datagridview
If Radek = -1 Then Exit Sub 'pokud je vybráno záhlaví, skončím
Dim IDN As Integer = SeznamDGV.Item(0, Radek).Value 'načtu si ID položky
SeznamBS.Filter = "ID = " & IDN 'v BindingSource vyfiltruju položku se zjištěným ID
SeznamBS.RemoveAt(0) 'vyfiltrovanou položku odstraním
Try 'toto je upraveno podle té nápovědy z Microsoftu
   Me.Validate()
   Me.SeznamBS.EndEdit()
   Me.SeznamTA.Update(Me.DataDS.Seznam) 'tady to zhavaruje
   MsgBox("Update successful")
Catch ex As Exception
   MsgBox("Update failed   " & Err.Description)
End Try
SeznamBS.Filter = ""
Me.SeznamTA.Fill(Me.DataDS.Seznam)

Předem dík za pomoc.

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

Nejsem si jistý (nejsem žádnej guru), ale přijde mi, že je špatně toto:

Me.SeznamBS.EndEdit()
Me.SeznamTA.Update(Me.DataDS.Seznam) 'tady to zhavaruje

EndEdit děláte u SeznamBS a Update děláte na SeznamTA

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

Tak to bylo i v tom příkladu. EndEdit u BindingSource a Update u TableAdapter.

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

Omlouvám se, netrklo mě, že to první je BindingSource a to druhé Table Adapter...

Ještě mě napadlo máte v té SQL tabulce definovaný primární klíč?

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

A máte deletecommand pro TableAdapter deklarován/nastaven? Na tuto exception existuje na internetu spoustu odkazů,kde najdete řešení.

Popravdě nerozumím Vašemu přístupu k práci a programování.

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

Programování ve Visual Basicu mi celkem jde, bohužel databáze jsou pro mě pořád tak trochu španělskou vesnicí. Předpokládal jsem, že když propojím databázi přes průvodce (Add New DataSource...) a propojím BindigSource a Table adapter, tak že by už všechny deklarace měly být vytvořeny. Uložení nové položky funguje bez dalších deklarací v pohodě jednořádkovým příkazem. Proč funguje Update s příkazem na vložení nové položky, ale u odstranění položky nefunguje nechápu. proto potřebuju česky nakopnout. :)

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

Já spíš nerozumím tomu, proč využíváte zrovna TableAdapter a podobné komponenty. EF by Vám vyřešil všechny problémy.

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

Co to je to EF?

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

Entity Framework

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

Tak to nevím co to je a kde to je. Problém je ale vyřešen díky dotazu pana Štěpánka. Poté co jsem přidal primární klíc do tabulky, tak vše funguje.

Všem děkuji za pomoc.

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