[SQLite, ADO.NET] Master-Detail, update en insert

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben de afgelopen dagen bezig met het begrijpen van SQLite en ADO.NET.
Ik heb een database gemaakt met de volgende tabellen:
* Klanten
* Artikelen
* Orders
* OrderDetails

Op basis van een gevonden voorbeeld (http://www.akadia.com/ser...chronized%20Master-Detail) heb ik nu een form waar bovenin een combobox zit met de klanten, daaronder een aantal tekstvakken met de gegevens van de klant.
Dan een grid met de orders van deze klant en daaronder nog een grid maar nu met de details van order.
Als ik een andere klant selecteer in de combobox worden de tekstvakken en de grids netjes geupdate.

Ik gebruik hiervoor drie keer een SQLiteDataAdapter (klanten, orders, orderdetails) en ik vul die in een dataset.
Vervolgens worden de relaties gedefinieerd tussen klanten-orders en orders-details.
Dan wordt de DefaultViewManager van de dataset gebruikt als datasource van de grids met de relatie als datamember.
De DefaultViewManager wordt ook gebruikt als datasource voor de tekstvakken.

Dit gedeelte begrijp ik nog wel. Ik heb het zelfs al een beetje aangepast.

Nu wil ik op dit form ook de gegevens van de klant kunnen wijzigen en nieuwe klanten kunnen toevoegen.
Na veel lezen begrijp ik dat ik na het maken van de SQLiteDataAdapter voor de klanten
C#:
1
SQLiteCommandBuilder builder = new SQLiteCommandBuilder(daKlanten);

moet aanroepen. Dan worden de update, delete en insert commands gemaakt.

Nu heb ik een knop 'Wijzingen opslaan' toegevoegd en als de gebruiker daar op klikt, moeten de wijzigingen in de tekstvakken naar de database worden gestuurd.
In het click-event test ik eerst of er wel wijzigingen zijn. Die zijn er nooit, dus gaat er wat mis.
Ik heb geprobeerd met
C#:
1
if (this.dsView.DataSet.HasChanges())
waarbij dsView de DefaultViewManager is.
Ook heb ik geprobeerd met
C#:
1
if (this.ds.HasChanges())
waarbij ds de dataset is.

Zoals je ziet, mis ik nog wat kennis. Omdat ik niet precies weet wat, kan ik het ook niet goed vinden via Google.
Ik hoop dan ook dat iemand van jullie me in de juiste richting kan sturen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben inmiddels weer een paar stappen verder.
Ik kan nu een klant toevoegen, verwijderen en wijzigen:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
private void BtnSaveClick(object sender, EventArgs e)
{
    // For new records:
    this.BindingContext[dsView, "Klanten"].EndCurrentEdit();

    for (var nRow = 0; nRow < ds.Tables["Klanten"].Rows.Count; nRow++)
    {
        // Check for modified rows:
        if (ds.Tables["Klanten"].Rows[nRow].HasVersion(DataRowVersion.Proposed))
        {
            ds.Tables["Klanten"].Rows[nRow].EndEdit();
        }
    }

    var numUpdated = this.daKlanten.Update(this.ds, "Klanten");
}

private void BtnNieuwClick(object sender, EventArgs e)
{
    this.BindingContext[dsView, "Klanten"].AddNew();
}

private void BtnDeleteClick(object sender, EventArgs e)
{
    var current = this.cbCust.SelectedItem as DataRowView;
    if (current != null)
    {
        current.Row.Delete();
        var numUpdated = this.daKlanten.Update(this.ds, "Klanten");
    }
}


Bij een nieuw record zie ik dat het KlantID netjes automatisch wordt ingevuld in de database omdat het een auto-increment primary key is. Alleen die waarde komt niet terug in mijn dataset, waardoor ik geen twee nieuwe klanten achter elkaar kan maken.
Dit is op te lossen door alle bindings opnieuw te zetten, maar kan dat niet in 1 keer?
Ik had al gezocht naar iets als RefreshData, maar kon niets vinden.