Dobrý den, takže k Vašemu programu. První problém bude v názvu polí tabulky dtKolo. Pole "Memo", "Day" a "Time" jsou klíčová slova, která by se neměla používat pro názvy sloupců tabulek. Doporučuji je přejmenovat např. na "Pozn", "Den" a "Cas" nebo nějak podobně. Druhým problémem je, že v tabulce nemáte definován žádný primární klíč, podle kterého by pak následně probíhala aktualizace pomocí CommandBuilder. V tabulce sice máte pole "ID", ale toto není definováno jako primární klíč. Ideální je přímo v souboru MDB v tabulce KOLO vytvořit primární klíč a přiřadit mu vlastnost AutoIncrement. V programu pak u DataAdaptéru nastavit vlastnost MissingSchemaAction na hodnotu AddWithKey, tak jak je to v kódu níže. Tím určíte, že DataSet, který vznikne načtením zdrojových dat bude mít přesně stejnou strukturu jako tabulka Kolo v souboru MDB včetně primárního klíče. Určitě by bylo lepší v programu použít přísně typový dataset, který by kopíroval strukturu tabulky Kolo z MDB souboru a pro vázání dat použít objekt BindingSource, který hodně usnadňuje práci. Nechtěl jsem příliš šťourat do Vašeho kódu, ale přesto jsem si dovolil pár úprav. Ty důležité jsou pak okomentovány přímo v kódu. Ještě ke struktuře tabulky KOLO v databázi ACCESS: Pole ID - Automatické číslo. Pole ID je zároveň primárním klíčem Pole DEN - číslo (defaultní nastavení) Pole DISTANCE - text (defaultní nastavení) Pole CAS - text (defaultní nastavení) Pole PULSE - text (defaultní nastavení) Pole AVGSPEED - číslo (defaultní nastavení) pole POZN - memo
Imports System.Data.OleDb
Public Class Form1
Private da As New OleDbDataAdapter
Private dsHealth As New DataSet
Private con As OleDbConnection
Private cb As OleDbCommandBuilder
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Definice spojovacího řetězce
Dim strCon As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\kolo.mdb;"
Dim strQuery As String = "SELECT * FROM kolo"
con = New OleDbConnection(strCon)
da.SelectCommand = New OleDbCommand(strQuery, con)
' Vytvoření CommandBuilder včetně aktualizačních příkazů
cb = New OleDbCommandBuilder(da)
da.InsertCommand = cb.GetInsertCommand()
da.DeleteCommand = cb.GetDeleteCommand()
da.UpdateCommand = cb.GetUpdateCommand()
' Tímto řádkem se definuje, že datový adaptér si ze zdrojové databáze natáhne schéma včetně primárního klíče,
' který je nutný k následné aktualizaci pomocí třídy CommandBuilder
da.MissingSchemaAction = MissingSchemaAction.AddWithKey
Try
' Načtení dat ze zdroje
da.Fill(dsHealth, "Kolo")
' Naplnění objektu DataGridView
With Me.DataGridView1
.DataSource = dsHealth
.DataMember = "Kolo"
End With
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private Sub btnAddNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddNew.Click
' Přidání nového řádku do tabulky Kolo v DataSetu
Dim drKolo As DataRow = dsHealth.Tables("Kolo").NewRow
With drKolo
.Item("DEN") = Date.Now.Day
.Item("Distance") = "10"
.Item("CAS") = "33:22"
.Item("Pulse") = "111"
.Item("AvgSpeed") = 10 / 2
.Item("POZN") = "Good day!"
End With
dsHealth.Tables("Kolo").Rows.Add(drKolo)
End Sub
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
' Uložení změn do zdroje dat, provede se voláním metody Update objektu DataAdapter
' Před samotnou aktualizací proběhne ověření, zda došlo k nějaké změně v DataSetu
Dim dtSave As DataTable = dsHealth.Tables("Kolo").GetChanges
If Not dtSave Is Nothing Then
Try
' Aktualizace zdroje dat
da.Update(dtSave)
' Změny byly zapsány do zdroje dat, můžeme tedy potvrdit změny v DataSetu
dsHealth.Tables("Kolo").AcceptChanges()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End If
End Sub
End Class
Doufám, že to pomůže. Pokud by cokoliv bylo nejasné nebo by s něčím byl problém, rád poradím, případně zašlu kompletní projekt včetně souboru MDB.
|