Visual Basic a Databáze Access   otázka

VB.NET, ADO.NET, WinForms

Několik let spokojeně komunikuji s DB Accessu prostřednictvím Basicu 5, 6 a hlavně VBA z Excelu. Můj problém je Visual Basic. Mohu požádat o "postrčení" případně radu příkladem. Databázi připojím, zobrazím, ale nedaří se mi vytvořit přístup "ze zadu" např. programem vyhledat indexovaný záznam, ten editovat a následně uložit nebo prostě smazat. Chybí mi tu Recordset. Něco jako:

        With .cboUsek
            Call Fce.OtevritDB("_Usek", 1)
            If rstD.RecordCount < 1 Then GoTo DAL5
            .Clear
            .ListRows = rstD.RecordCount
            For i = 1 To rstD.RecordCount
                .AddItem rstD(1)
                rstD.MoveNext
            Next i
            Call UzavritDB
        End With
DAL5:
    End With

nebo

Sub JmenoStaniceVymazat()
Dim PC As String
    PC = JmenoStanice
    Call Fce.OtevritDB("_Evidence", 1)
        rstD.Index = "PC"
        rstD.Seek "=", PC
        If rstD.NoMatch = False Then   ' našel odpovídající záznam
            rstD.Delete
        End If
    Call Fce.UzavritDB
End Sub

jestli je mi pomoci tak moc děkuji předem

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

Jde o to, že VB.NET má novější mechanismy pro přístup k datům. Princip je týž, syntaxe ale malinko jiná. Najděte a nastudujte si věci jako je "dataset" a "datatable", prostě ADO.NET

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

děkuji za reakci, zkusím to tudy.

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

Stačí si přidat ve Visual Studiu nový datový zdroj (Data/Add New Data Source), což bude ta accessová databáze připojená pomocí OLE DB a potom po přetažení na formulář z okna Data Sources se automaticky vytvoří příslušné objekty pro práci s daty. Lze to udělat i kompletně programově, ale to je pro začátečníka mnohem složitější a není to typové šité na míru tomu datovému zdroji.

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

Děkuji za reakci, to co píšete s pomocí literatury Visual Basic 5,8,10 krok za krokem mám, ale tam končím. Atomaticky se vytvoří a databázi mohu listovat, ale ne ovládat.

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

Pokud vložíte na formulář DataGridView a nastavíte mu příslušný datový zdroj, budete moct i přidávat, měnit a odstraňovat záznamy. Z knih se nic nenaučíte, snažte se experimentovat a číst dokumentaci v MSDN.

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

Ondřeji děkuji,

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

Dobrý den, já bych se k tomu taky přidal se dvěma dotazy:

1.

Vše co tu bylo psáno je mi již jasné. Zajímalo by mne ale, jestli se nějak dá načíst konkrétní hodnota přímo z databáze. Mám třeba databázi, kde jsou např. pole "Rok" "Typ", "Náklady" apod. Ve starším VB (do v. 6) šlo právě přes recordset formou "...Recordset!Rok" načíst hodnotu z pole "Rok". V novějších verzích se mi nepodařilo najít ani přijít na to jak udělat to samé.

2.

Přidávám položku do databáze přes dataset takto:

    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
        Me.SeznamTableAdapter.Update(Me.SDPDataSet.Seznam.AddSeznamRow("A", "B", "C"))
        Me.SDPDataSet.AcceptChanges()
        Label1.Text = DataGridView1.RowCount
    End Sub

Na nesmyslné hodnoty se prosím nedívejte, je to pokusná položka. Pokud ji takto přidám, automaticky se mi objeví změna i v propojeném DataGridView. Mám ale problém v tom, že se neuloží do připojené databáze a po dalším spuštění aplikace tam ta položka není. Mohli byste mi prosím někdo poradit jak je to správně?

Předem děkuji za rady.

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

1. DataSet má vlastnost Tables což seznam tabulek, každá tabulka má vlastnost Rows což je seznam řádků a každý Row má vlastnost Item, což jsou data v konkrétním sloupci.

Dim name = contactsDataSet.Tables("Kontakty").Rows(0).Item("Jmeno")

Uvedený příklad načte hodnotu sloupce Jmeno z prvního řádku v tabulce Kontakty.

Je to příklad pro obecná data, pokud vytvoříte objekty pro práci s daty vizuálně pomocí návrháře, vytvoří vám to automaticky objekty s příslušným názvem a odpovídajícím datovým typem.

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

Děkuji, tohle mi moc pomohlo. nemohl byse mi ještě poradit s tím druhým bodem? Jak docílit, aby se změny uložily?

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

Zkusím se na to podívat, z hlavy nevím, budu si muset vytvořit testovací databázový projekt.

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

Já data v Accesu aktualizuji takhle

Dim strQuery As String = "SELECT * FROM tbl_Activity WHERE ID=" & ID
Dim ColumnName as String = "status"
Dim newValue as String = "OK"
UpdateDB(strQuery, ColumnName, newNalue)

Public Sub UpdateDB(ByRef Query As String, ByRef CN1 As String, ByRef Value1 As Object)
        Try
            Using Connection As New OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = Data.mdb")
                Dim dt As DataTable = New DataTable
                Dim da As New OleDbDataAdapter(Query, Connection)
                Dim R As Integer = 0
                da.Fill(dt)
                For Each DR As DataRow In dt.Rows
                    dt.Rows(R).Item(CN1) = Value1
                    R += 1
                Next
                Dim cmd As New OleDbCommandBuilder(da)
                da.Update(dt)
                dt.AcceptChanges()
            End Using
        Catch ex As Exception
            cError.Message(ex.GetBaseException.ToString)
        End Try
    End Sub

V novém projektu jsem si na to udělal třídu, abych to mohl volat jednodušeji a universálně. Já mám v každé tabulce sloupec "ID" který mi identifikuje řádek, přesto

snad není problém si to upravit

Public Class c_Data
#Region "Delete"
    Public ReadOnly Property DeleteMulti(ByVal Where As String, ByVal Tablename As String) As Boolean
        Get
            Dim SQLstring As String = "DELETE * FROM " & Tablename & " WHERE " & Where
            Return cmdTable(SQLstring)
        End Get
    End Property
#End Region
#Region "Update"
    Public ReadOnly Property Update(ByVal ID As String, ByVal NewValue As String, ByVal Tablename As String, ByVal ColumnName As String) As Boolean
        Get
            Dim SQLstring As String = "UPDATE " & Tablename & " SET " & ColumnName & "='" & NewValue.Trim & "' WHERE ID='" & ID & "'"
            Return cmdTable(SQLstring)
        End Get
    End Property
    Public ReadOnly Property Update(ByVal ID As String, ByVal NewValue As Long, ByVal Tablename As String, ByVal ColumnName As String) As Boolean
        Get
            Dim SQLstring As String = "UPDATE " & Tablename & " SET " & ColumnName & "='" & NewValue & "' WHERE ID='" & ID & "'"
            Return cmdTable(SQLstring)
        End Get
    End Property
    Public ReadOnly Property Update(ByVal ID As String, ByVal NewValue As Single, ByVal Tablename As String, ByVal ColumnName As String) As Boolean
        Get
            Dim SQLstring As String = "UPDATE " & Tablename & " SET " & ColumnName & "='" & NewValue & "' WHERE ID='" & ID & "'"
            Return cmdTable(SQLstring)
        End Get
    End Property
    Public ReadOnly Property Update(ByVal ID As String, ByVal NewValue As Boolean, ByVal Tablename As String, ByVal ColumnName As String) As Boolean
        Get
            Dim SQLstring As String = "UPDATE " & Tablename & " SET " & ColumnName & "='" & NewValue & "' WHERE ID='" & ID & "'"
            Return cmdTable(SQLstring)
        End Get
    End Property
    Public ReadOnly Property Update(ByVal ID As String, ByVal NewValue As Date, ByVal Tablename As String, ByVal ColumnName As String) As Boolean
        Get
            Dim SQLstring As String = "UPDATE " & Tablename & " SET " & ColumnName & "='" & NewValue & "' WHERE ID='" & ID & "'"
            Return cmdTable(SQLstring)
        End Get
    End Property

    Public ReadOnly Property Update(ByVal ID As Long, ByVal NewValue As String, ByVal Tablename As String, ByVal ColumnName As String) As Boolean
        Get
            Dim SQLstring As String = "UPDATE " & Tablename & " SET " & ColumnName & "='" & NewValue.Trim & "' WHERE ID=" & ID
            Return cmdTable(SQLstring)
        End Get
    End Property
    Public ReadOnly Property Update(ByVal ID As Long, ByVal NewValue As Long, ByVal Tablename As String, ByVal ColumnName As String) As Boolean
        Get
            Dim SQLstring As String = "UPDATE " & Tablename & " SET " & ColumnName & "='" & NewValue & "' WHERE ID='" & ID & "'"
            Return cmdTable(SQLstring)
        End Get
    End Property
    Public ReadOnly Property Update(ByVal ID As Long, ByVal NewValue As Single, ByVal Tablename As String, ByVal ColumnName As String) As Boolean
        Get
            Dim SQLstring As String = "UPDATE " & Tablename & " SET " & ColumnName & "='" & NewValue & "' WHERE ID='" & ID & "'"
            Return cmdTable(SQLstring)
        End Get
    End Property
    Public ReadOnly Property Update(ByVal ID As Long, ByVal NewValue As Boolean, ByVal Tablename As String, ByVal ColumnName As String) As Boolean
        Get
            Dim SQLstring As String = "UPDATE " & Tablename & " SET " & ColumnName & "='" & NewValue & "' WHERE ID='" & ID & "'"
            Return cmdTable(SQLstring)
        End Get
    End Property
    Public ReadOnly Property Update(ByVal ID As Long, ByVal NewValue As Date, ByVal Tablename As String, ByVal ColumnName As String) As Boolean
        Get
            Dim SQLstring As String = "UPDATE " & Tablename & " SET " & ColumnName & "='" & NewValue & "' WHERE ID='" & ID & "'"
            Return cmdTable(SQLstring)
        End Get
    End Property
    Public ReadOnly Property UpdateMulti(ByVal Where As String, ByVal NewValue As Long, ByVal Tablename As String, ByVal ColumnName As String) As Boolean
        Get
            Dim SQLstring As String = "UPDATE " & Tablename & " SET " & ColumnName & "=" & NewValue & " WHERE " & Where
            Return cmdTable(SQLstring)
        End Get
    End Property
    Public ReadOnly Property UpdateMulti(ByVal Where As String, ByVal NewValue As Boolean, ByVal Tablename As String, ByVal ColumnName As String) As Boolean
        Get
            Dim SQLstring As String = "UPDATE " & Tablename & " SET " & ColumnName & "=" & NewValue & " WHERE " & Where
            Return cmdTable(SQLstring)
        End Get
    End Property
#End Region
#Region "Action"
    Private ReadOnly Property cmdTable(ByVal SQLstring As String) As Boolean
        Get
            'Debug.print("cmdTable" & vbTab & SQLstring)
            Dim Connection As New System.Data.OleDb.OleDbConnection With {.ConnectionString = My.Settings.MSConnectionString}
            Dim cmd As New System.Data.OleDb.OleDbCommand With
                        {.CommandType = System.Data.CommandType.Text,
                        .Connection = Connection,
                        .CommandText = SQLstring}
            Try
                Connection.Open()
                cmd.ExecuteNonQuery()
                Connection.Close()
                cmd.Cancel()
                Return True
            Catch ex As Exception
                cMessage.ErrorMsg(Err.Description, "Chyba při update:" & SQLstring)
                Return False
            End Try
        End Get
    End Property
#End Region
End Class

nahlásit spamnahlásit spam 2 / 2 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