Uložení změny v databázi   otázka

VB.NET

Ve VB 2010 při mazání záznamu z databáze používám:

DataDataSet.Tables("Upravy").Rows(i).Delete()
DataDataSet.Tables("Upravy").AcceptChanges()

Takovýto způsob odstranění položky v databázi jsem po dlouhém bádání vydedukoval. Změna se provede, řádek zmizí i v DataGridView a vše se tváří, že položka je pryč.

Problémem ale je, že v samotné databázi Access (mdb) se změna neuloží a při novém spuštění aplikace na mě ta smazaná položka opět vykukuje. Nemůžete mi prosím někdo poradit jak docílit toho, aby se položka odstranila definitivně a ne jen na chvíli?

Předem děkuji za radu.

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

Problém je v tom, že řádek mažete pouze s objektu DataSet. Aby došlo k aktualizaci datového zdroje (ve Vašem případě Access), musíte provést aktualizační dotaz nad samotným zdrojem (např. pomocí SqlDataAdapteru, ke kterému máte přiřazen i aktualizační dotaz (DELETE) ve formě SqlCommand, případně uvedený SqlCommand zavolat pomocí metody ExecuteNonQuery).

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

Děkuji za odpověď, ale potřeboval bych asi jednoduchý příklad jak to udělat, protože SQL moc nerozumím.

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

je tu o tom někde článek od p. Jechy. Sice je o MSSQL, ale s accesem je to podobné

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

Áaa pravda.

Omlouvám se za chybnou interpretaci objektů SQLCommand a SqlDataAdapter. Samozřejmě v případě napojení na Access je nutné použít OleDbCommand a OleDataAdapter.

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

Jenže jak? Nějakej jednoduchej funkční příklad tu hledám už několik dní. Vykoumal jsem, že přidání nové položky lze udělat příkazem o jednom řádku a to:

TableAdapter.Update(DataSet.Tables("Upravy").Rows.Add("AAA", "BBB", "CCC"))

Jak to ale udělat v případě změn ve stávajících položkách fakt netuším. Nedaří se mi ani editace položek, ani jejich odstanění.

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

ja to pouzivam takhle, jako funkci:

Public Function DeleteFileFromDB(ByVal IDrecord As Integer) As Boolean

        If MessageBox.Show("Odstranit soubor z databazy?", "Potvrzeni", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.No Then Exit Function
        Try
            Dim cmd As OleDbCommand            
            If con.State = ConnectionState.Closed Then
                If Not Connection() Then
                    Return False
                    Exit Function
                End If
            End If

            cmd = con.CreateCommand()
            cmd.CommandText = "DELETE * FROM [DATA] WHERE ID = " & IDrecord
            cmd.ExecuteNonQuery()
            cmd.Dispose()
            con.Close()
            con.Dispose()
            Return True

        Catch exo As OleDb.OleDbException
            MessageBox.Show(exo.Message)
            Return False
        Catch ex As Exception
            MessageBox.Show(ex.Message)
            Return False
        End Try
    End Function

To mam v modulu.

Pouziti ve formulari vypada takhle:

 If DeleteFileFromDB(gIDrecord) Then
    lblSave.Text = "Priloha byla uspesne odstranena."
 else
 '...
 end if

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

Děkuju. Ještě bych ale potřeboval vědět jak nadefinovat con, Connection a OleDBCommand, aby mi to neházelo chyby.

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

OleDBCommand neni treba definovat...

Pokud Vas projekt ten typ nezna, chybi:

Imports System.Data.OleDb

Deklarace a funkce vypada takhle:

Public con As New OleDb.OleDbConnection  

  Public Function Connection() As Boolean
        Dim intCounter As Integer = 0

        If Not File.Exists(ProgDataPath) Then
            MsgBox("Nemate nastavenou cestu k databazi")
            Return False
            Exit Function
        End If

        Try            
            con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ProgDataPath & ";Persist Security Info=False"                          
                con.Open()
        Catch exo As OleDb.OleDbException
            MessageBox.Show(exo.Message)
            Return False     
        End Try
            Return True
    End Function

V globalni promenne ProgDataPath mam nastavenou celkou cestu k databazi (kuprikladu D:\Data\data.mdb")

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

Inak, všimol som si, že v oboch častiach Catch máte ten istý kód, aký zmysel má v tomto prípade rozlišovať OleDbException, ak tak, či onak, spravíte to isté?

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