Toon posts:

[VB.NET 2005] Dataset updaten met meerdere tabellen

Pagina: 1
Acties:
  • 161 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik wil graag met een access database meerdere tabellen die een relatie met elkaar hebben updaten,
maar als de update op een van de tabellen mislukt en de andere wel lukt heb je inconsistente database, dat wil ik graag voorkomen. Maar access heeft geen rollback actie :( . Heeft iemand enig idee hoe je dat netjes kan oplossen ? een slordige manier is om een delete actie te doen in de catch :?
ik heb het gevoel dat dit netter moet kunnen, dat in de dataset d.m.v. een relatie misschien een soort check gedaan kan worden of de data weggeschreven kan worden :X
alle opmerkingen/gedachten zijn welkom

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Access kent wel het concept van Transactions.
Kijk eens naar de methods van je OleDbConnection in .NET. Daar heb je een StartTransaction/BeginTransaction.
Die returnen een Transaction object en dat kan je committen / rollbacken.

https://fgheysels.github.io/


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 09:27

mulder

ik spuug op het trottoir

Access heeft toch transactions?

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
whoami schreef op maandag 02 april 2007 @ 10:34:
Access kent wel het concept van Transactions.
Kijk eens naar de methods van je OleDbConnection in .NET. Daar heb je een StartTransaction/BeginTransaction.
Die returnen een Transaction object en dat kan je committen / rollbacken.
thanks, ik ga het proberen

Verwijderd

Topicstarter
het is gelukt met de rollback met stored procedures, alles vanuit de code geprogrammeerd.
nu moet ik nog proberen om die transactie aan een dataset te koppelen en de controls met databinding.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
:?
Hoe bedoel je dat ?

Gewoon toch op het moment dat je de wijzigingen naar de DB wilt gaan saven:
pseudo-code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
conn.Open();
Transaction tx = conn.BeginTransaction()
try
{
   dataAdapter.Update (table1);
   dataAdapter.Update (table2);
   thx.Commit();
}
catch
{
   thx.Rollback();
}
finally
{
   conn.Close();
}

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op maandag 02 april 2007 @ 12:35:
:?
Hoe bedoel je dat ?

Gewoon toch op het moment dat je de wijzigingen naar de DB wilt gaan saven:
pseudo-code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
conn.Open();
Transaction tx = conn.BeginTransaction()
try
{
   dataAdapter.Update (table1);
   dataAdapter.Update (table2);
   thx.Commit();
}
catch
{
   thx.Rollback();
}
finally
{
   conn.Close();
}
Ja dat dacht ik ook, zo heb ik het ook, maar dan krijg ik de volgende foutmelding:

ExecuteReader requires the command to have a transaction when the connection assigned to the command is in a pending local transaction. The Transaction property of the command has not been initialized.

Weet jij misschien hoe je die command uit je tableAdapter haalt ?

ik heb wel een site gevonden met C# code:
http://weblogs.asp.net/se...orTags=0&o=DateDescending

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 09:27

mulder

ik spuug op het trottoir

Je moet UpdateCommand van de DataAdapter zetten. http://www.devx.com/vb2themax/Tip/19603

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Ja maar met datasets werk je met een TableAdapter en die heeft geen property updatecommand die je kan aanspreken, die zit onderwater en wordt door m$ Microsoft of MS geprogrammeerd.
Dit is wat ik geprobeerd heb:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
       tableAdapter.Connection.Open()
        trans = tableAdapter.Connection.BeginTransaction
        Dim dttype As Type
        Dim prop As Reflection.PropertyInfo
        dttype = tableAdapter.GetType
        prop = dttype.GetProperty("CommandCollection", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)

        Dim cmd() As OleDbCommand = prop.GetValue(tableAdapter, Nothing)
        For Each command As OleDbCommand In cmd
            command.Transaction = trans
        Next
Maar dan krijg ik dezelfde error als ik die eerder al gepost heb: ExecuteReader requires the command to have a transaction ....
Ik denk dat die oledbCommand dan niet goed wordt gekoppeld aan de command van de tableAdapter

[ Voor 1% gewijzigd door RobIII op 02-04-2007 13:14 ]


  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
Je moet gebruik maken van een CommandBuilder om geldige UpdateCommand's te genereren. Maak een OleDbCommandBuilder object aan, gebruik de functies GetInsertCommand(), GetDeleteCommand() GetUpdateCommand() voor iedere tabel die ge-update moet worden en probeer daarna pas een OleDbAdapter.Update() uit te voeren.

Nog 1 punt: je kan pas een UpdateCommand genereren als aan de volgende voorwaardes voldaan is:
* Er is in iedere geval een SelectCommand geinitialiseerd in de DataAdapter.
* Er is een kolom aanwezig in iedere tabel met Primary Key waarde.

Ow, en al die Reflection code kan je allemaal verwijderen, heb je nergens voor nodig.

[ Voor 7% gewijzigd door MacWolf op 03-04-2007 09:00 ]

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


Verwijderd

Topicstarter
MacWolf schreef op dinsdag 03 april 2007 @ 09:00:
Je moet gebruik maken van een CommandBuilder om geldige UpdateCommand's te genereren. Maak een OleDbCommandBuilder object aan, gebruik de functies GetInsertCommand(), GetDeleteCommand() GetUpdateCommand() voor iedere tabel die ge-update moet worden en probeer daarna pas een OleDbAdapter.Update() uit te voeren.

Nog 1 punt: je kan pas een UpdateCommand genereren als aan de volgende voorwaardes voldaan is:
* Er is in iedere geval een SelectCommand geinitialiseerd in de DataAdapter.
* Er is een kolom aanwezig in iedere tabel met Primary Key waarde.

Ow, en al die Reflection code kan je allemaal verwijderen, heb je nergens voor nodig.
Na lang ploeten was ik daar gisteren al een beetje achter gekomen ja, ik heb een werkende oplossing gekregen met die commandbuilder. Het enige probleem wat ik nu nog heb is nadat je een fout maakt in een van de 2 tabellen en de rollback wordt uitgevoerd en je wilt de gegevens corrigeren dat ie de foutmelding geeft: de transactie is al verlopen en kan niet meer gebruikt worden. Ik heb van alles geprobeerd met begin transaction en connections heropenen en dergelijke maar dat mocht niet baten. Heeft iemand enig idee hoe je dat kan oplossen ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Wanneer geeft ie die foutmelding ?
Als je je gegevens corrigeert, en opnieuw probeert te updaten, dan creeër je wel een nieuwe transactie toch ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op dinsdag 03 april 2007 @ 11:47:
Wanneer geeft ie die foutmelding ?
Als je je gegevens corrigeert, en opnieuw probeert te updaten, dan creeër je wel een nieuwe transactie toch ?
ja klopt, ik maak inderdaad een nieuwe transactie en doe de verbinding sluiten en opnieuw openen. Ik koppel dan ook weer de transactie aan de OleDbCommand.

  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
Verwijderd schreef op woensdag 04 april 2007 @ 09:04:
[...]
ja klopt, ik maak inderdaad een nieuwe transactie en doe de verbinding sluiten en opnieuw openen. Ik koppel dan ook weer de transactie aan de OleDbCommand.
Kun je anders een stuk code laten zien?

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


Verwijderd

Topicstarter
MacWolf schreef op woensdag 04 april 2007 @ 09:22:
[...]

Kun je anders een stuk code laten zien?
Visual Basic .NET:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
form_load
        cmd = New OleDbCommand
        cmd.CommandText = "SELECT * FROM tabel"
        da = New OleDbDataAdapter()
        da.SelectCommand = cmd
        cmd.Connection = conn
        Dim custCB As OleDbCommandBuilder = New OleDbCommandBuilder(da)
        conn.Open()
        trans = conn.BeginTransaction()
        cmd.Transaction = trans
        da.Fill(dataset, "tabel")
        bindingsource.DataSource = dataset
        bindingsource.DataMember = dataset.Tables("tabel").TableName
        bindingsource.AddNew()

        cmd2 = New OleDbCommand
        cmd2.CommandText = "SELECT * FROM tabel2"
        cmd2.Connection = conn
        cmd2.Transaction = trans
        da2 = New OleDbDataAdapter()
        da2.SelectCommand = cmd2
        Dim custCB2 As OleDbCommandBuilder = New OleDbCommandBuilder(da2)
        da2.Fill(custDS, "tabel2")
        bindingsource2.DataMember = dataset.Tables("tabel2").TableName
        bindingsource2.DataSource = dataset
        bindingsource2.AddNew()
einde form_load

save knop
        Try
            Me.Validate()
            bindingsource.EndEdit()
            bindingsource2.EndEdit()
            da.Update(dataset, "tabel")
            da2.Update(dataset, "tabel2")
            trans.Commit()
            bindingsource.AddNew()
            bindingsource2.AddNew()
        Catch ex As Exception
            Debug.Print("fout: " & ex.Message)
            trans.Rollback()
        Finally
            conn.Close()
            conn.Open()
            trans = conn.BeginTransaction()
            cmd.Transaction = trans
            cmd2.Transaction = trans
        End Try
einde save knop

Het opslaan werkt, de rollback werkt ook, alleen bij verbeteren van gegevens en dan weer opslaan geeft ie de foutmelding: ExecuteNonQuery requires the command to have a transaction when the connection assigned to the command is in a pending local transaction. The Transaction property of the command has not been initialized.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Waarom doe je een AddNew in je form load ?
Waarom start je je transactie in de form load ? Een transactie moet zo kort mogelijk duren.
Waarom laat je je connectie gedurende de ganse tijd open staan ?


Doe eens in je form_load enkel de gegevens ophalen, deze tonen en de connectie sluiten.
In de click van je save button open je de connectie, start je de transactie, save je alles, en commit / rollback je, en sluit je connectie.
Dan ga je ook die ranzige boel niet meer nodig hebben dat je na het saven direct je connectie weer opent en een nieuw transactie start.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op woensdag 04 april 2007 @ 09:45:
Waarom doe je een AddNew in je form load ?
Waarom start je je transactie in de form load ? Een transactie moet zo kort mogelijk duren.
Waarom laat je je connectie gedurende de ganse tijd open staan ?


Doe eens in je form_load enkel de gegevens ophalen, deze tonen en de connectie sluiten.
In de click van je save button open je de connectie, start je de transactie, save je alles, en commit / rollback je, en sluit je connectie.
Dan ga je ook die ranzige boel niet meer nodig hebben dat je na het saven direct je connectie weer opent en een nieuw transactie start.
Ik doe die addnew in de form_load zodat de gebruiker gelijk kan invoegen, het is puur voor invoegen. Ik heb gedaan zoals jij zei, transactie en dergelijke uit de form_load verwijderd en onder de save knop gezet. Ik heb allerlei variaties geprobeerd maar blijf dezelfde error houden.
Ik denk dat het in die OledbCommand zit. Daar slaat die foutmelding namelijk ook op.
Want moet je bij de save knop die OledbCommand ook opnieuw definiëren ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Toon eens de code die je nu in je Save-click hebt.
Als het goed is, zou die ong. zo moeten zijn: (pseudo)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
conn.Open();
IDbTransaction thx = conn.BeginTransaction();
try
{
    da.Update (tabel1);
    da.Update (tabel2);
    conn.Commit();
}
catch( ... )
{
   thx.Rollback();
}
finally
{
   conn.Close();
}

Ik heb die error (waar je het over hebt) ook eens gehad hier op Sql Server.
Nooit de oorzaak / oplossing gevonden echter. (Die fout komt nu trouwens ook niet meer voor 8)7)
\[.NET/SqlServer) Transaction is completed; no longer useable

[ Voor 30% gewijzigd door whoami op 04-04-2007 10:59 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Visual Basic .NET:
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
Dim trans As OleDbTransaction
        trans = Nothing
        Try
            If conn.State = ConnectionState.Broken Or conn.State = ConnectionState.Closed Then
                conn.Open()
            End If
            trans = conn.BeginTransaction()
            cmd.Connection = conn
            cmd2.Connection = conn
            cmd.Transaction = trans
            cmd2.Transaction = trans
            Me.Validate()
            bindingsource.EndEdit()
            bindingsource2.EndEdit()
            da.Update(custDS, "tabel")
            da2.Update(custDS, "tabel2")
            trans.Commit()
            bindingsource.AddNew()
            bindingsource2.AddNew()
        Catch ex As Exception
            Debug.Print("fout: " & ex.Message)
            trans.Rollback()
        Finally
            If conn.State = ConnectionState.Open Then conn.Close()
            trans.Dispose()
            trans = Nothing
        End Try

Ik twijfel over die command (cmd, cmd2) of ik dat zo goed heb gedaan of hoe dat anders wel moet :?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Op welke lijn krijg je die exceptie precies ? Krijg je dat op trans.Dispose() ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op woensdag 04 april 2007 @ 11:53:
Op welke lijn krijg je die exceptie precies ? Krijg je dat op trans.Dispose() ?
da.Update(custDS, "tabel"). Bij het updaten dus van de datatable, het wegschrijven naar de database

  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
Verwijderd schreef op woensdag 04 april 2007 @ 11:56:
[...]
da.Update(custDS, "tabel"). Bij het updaten dus van de datatable, het wegschrijven naar de database
Ik heb zelf nooit echt iets met Transactions gedaan, maar als je de code op deze pagina bekijkt, denk ik dat je het volgende zou kunnen verbeteren: probeer pas een command te initialiseren en daarbij de transaction aan het command toe te kennen, nadat je de transaction gestart hebt. Uit de voorbeeldpagina:

Visual Basic .NET:
1
2
Dim trans As OleDb.OleDbTransaction = connUsers.BeginTransaction(IsolationLevel.ReadCommitted)
Dim cmd As New OleDb.OleDbCommand( "UPDATE People SET FirstName=? WHERE LastName=?", connUsers, trans)


Daarnaast vind ik je gebruik van de Bindingsource.AddNew() methodes eigenaardig. Waarom gebruik je die methodes precies? In het voorbeeld wordt iig gekozen voor ResetBindings() - wel wordt daarbij de data opnieuw ingeladen.

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


Verwijderd

Topicstarter
MacWolf schreef op woensdag 04 april 2007 @ 12:07:
[...]
Daarnaast vind ik je gebruik van de Bindingsource.AddNew() methodes eigenaardig. Waarom gebruik je die methodes precies?
Die pagina had ik ook gevonden, daar heb ik ook wat info vandaan gehaald. Die Bindingsource.AddNew() gebruik ik omdat de controls datagebonden zijn via een bindingsource aan de dataset. Dus hiermee zorg je ervoor dat alle controls leeggemaakt worden en dat je een nieuwe record kan toevoegen.

Verwijderd

Topicstarter
MacWolf schreef op woensdag 04 april 2007 @ 12:07:
[...]
probeer pas een command te initialiseren en daarbij de transaction aan het command toe te kennen, nadat je de transaction gestart hebt.
Dat kan niet omdat ik mijn dataAdapter in het form_load fill, dat gaat niet zonder die select van de command. Op die voorbeeldpagina doet hij de dataAdapter na elke record fillen :? dat is juist niet het idee van datasets. Bij een dataset laadt je 1 keer in form_load bijvoorbeeld de data uit de database en daarna doe je de records wegschrijven/muteren/selecteren zonder fill actie elke keer. Want dan houd je nog steeds het vele dataverkeer naar je database toe als je elke keer een fill actie doet.

Inmiddels heb ik wel een andere werkende oplossing, maar geen schone.
Ik heb een functie die een 2e dataset aanmaakt, die de 1e dataset kopieert en vervolgens via de transactie de data probeert te updaten naar de database, als dat mislukt dan de rollback en dispose en connectie sluiten en vervolgens heb je weer de 1e dataset, die wordt geupdate door de gebruiker en vervolgens wordt de functie weer aangeroepen, weer dataset aangemaakt en gekopieerd van de 1e dataset en gegevens weggeschreven naar database via nieuwe transactie.
Het is een werkende oplossing maar niet zo netjes. Ik had gehoopt dat het sneller en beter kon.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Heb je ook al eens naar de innerexception gekeken ? Misschien gaat er iets fout bij het updaten ... / inserten . Hoe zien jouw SQL commands er uit ?
Je zegt dat dit enkel voorkomt bij het updaten van gegevens ? Hoe ziet het UPDATE sql command er uit ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op woensdag 04 april 2007 @ 12:22:
Heb je ook al eens naar de innerexception gekeken ? Misschien gaat er iets fout bij het updaten ... / inserten . Hoe zien jouw SQL commands er uit ?
Je zegt dat dit enkel voorkomt bij het updaten van gegevens ? Hoe ziet het UPDATE sql command er uit ?
Ik heb alle code gepost, daar staat het niet bij, dus dan neem ik aan dat microsoft dat voor je programmeert. Omdat je met een dataset werkt zitten daar alle gegevens en tabelstructuren in, dus je schrijft zelf geen update sql, die zit gewoon in die dataset/dataAdapter lijkt mij. Bij het zoeken in het project op UPDATE vond ik wel dit in de dataset.xsd:

Visual Basic .NET:
1
2
<CommandText>UPDATE `tabel1` SET `ADR_CODE` = ?, `ADR_Straat` = ?, `ADR_Huisnr` = ?, `ADR_HrTvgsl` = ?, `ADR_Postcode` = ?, `ADR_Plaats` = ? WHERE ((`ADR_Id` = ?) AND ((? = 1 AND `ADR_CODE` IS NULL) OR (`ADR_CODE` = ?)) AND ((? = 1 AND `ADR_Straat` IS NULL) OR (`ADR_Straat` = ?)) AND ((? = 1 AND `ADR_Huisnr` IS NULL) OR (`ADR_Huisnr` = ?)) AND ((? = 1 AND `ADR_HrTvgsl` IS NULL) OR (`ADR_HrTvgsl` = ?)) AND ((? = 1 AND `ADR_Postcode` IS NULL) OR (`ADR_Postcode` = ?)) AND ((? = 1 AND `ADR_Plaats` IS NULL) OR (`ADR_Plaats` = ?)))</CommandText>
<CommandText>UPDATE `tabel2` SET `KLA_CODE` = ?, `KLA_Naam` = ?, `KLA_ADR_CODE` = ? WHERE ((`KLA_Id` = ?) AND ((? = 1 AND `KLA_CODE` IS NULL) OR (`KLA_CODE` = ?)) AND ((? = 1 AND `KLA_Naam` IS NULL) OR (`KLA_Naam` = ?)) AND ((? = 1 AND `KLA_ADR_CODE` IS NULL) OR (`KLA_ADR_CODE` = ?)))</CommandText>


Dat zijn de 2 tabellen die ik wil updaten (records invoegen). Dit wordt allemaal genereert vanuit de dataset. Insert, Delete, Select en Update staan allemaal in dit bestand voor beiden tabellen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Die UPDATE wordt gegenereert door je command builder.
Verander die UPDATE eens, zodanig dat die WHERE clausule wat eenvoudiger is. (Enkel een ID neemt).

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op woensdag 04 april 2007 @ 12:46:
Die UPDATE wordt gegenereert door je command builder.
Verander die UPDATE eens, zodanig dat die WHERE clausule wat eenvoudiger is. (Enkel een ID neemt).
Gedaan, maar blijf ik dezelfde error houden. Maar de eerste keer doe je een insert toch, omdat je met een nieuwe record bezig bent. Gaat die fout, dan doet ie niks naar de database schrijven maar blijven die gegevens denk ik wel in de dataset. Ga je dan wijzigingen brengen en weer saven dan doet ie denk ik pas de update op zijn eigen dataset. Corrigeer me a.u.b. als ik het mis heb.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Hoezo, de eerste keer doe je een insert ? Eerder had je gezegd dat je die fout enkel krijgt bij het updaten ? Krijg je die fout nu bij het aanpassen van een bestaand, of het maken van een nieuw record ?

De gegevens blijven idd in je DataSet, maar, de data-adapter weet dat hij ook de volgende keer die gegevens moet inserten. De actie die de data-adapter onderneemt, hangt nl. af van de RowState property van iedere datarow.
Daarom moet je ook, als je transactie gelukt is, AcceptChanges aanroepen op je dataset. Dit zorgt ervoor dat je dataset weet dat hij geen wijzigingen meer bevat tov de DB. (Alle RowStates worden dan op unchanged gezet).

Stel dat je dit niet doet (acceptchanges aanroepen (en dat doe je niet zie ik)), en stel je deze situatie voor:
je voegt een row toe aan je datatable; die row krijgt de RowState 'Added'.
Je klikt op save; je data-adapter ziet de RowState Added, en zal de INSERT uitvoeren voor die row.
Je doet geen call naar AcceptChanges.
Je wijzigt de row die je net toegevoegd had. Die RowState blijft echter op 'Added' staan.
Je saved; de DataAdapter doet opnieuw een INSERT van diezelfde row

Doe je echter wel een call naar Acceptchanges na je eerste save, dan zal de rowstate van die row op 'Modified' komen, en weet de DataAdapter dat hij een UPDATE moet doen, ipv een INSERT.

Echter, dit verklaart imho nog niet waarom je die bepaalde exceptie krijgt...

En wat bedoel je, dan doet ie de aanpassingen op z'n eigen dataset ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op woensdag 04 april 2007 @ 13:00:
Hoezo, de eerste keer doe je een insert ? Eerder had je gezegd dat je die fout enkel krijgt bij het updaten ? Krijg je die fout nu bij het aanpassen van een bestaand, of het maken van een nieuw record ?
Ja maar als je addNew aanroept van de bindingsource dan doe je toch een insert query ? update doe je toch alleen op bestaande records ? stel dat het fout gaat dat invoegen van die record, dan krijg je de gelegenheid om die gegevens aan te passen en nogmaals op te slaan. Op dat moment krijg ik de fout. Maar stel dat je de eerste keer een goede invoert en vervolgens weer een record probeert in te voeren, dan krijg je ook de error, ongeacht of die goed of fout is. Het probleem zit hem dus in de 2e keer gebruiken van die command. Dat komt weer omdat ik tijdens het form_load die dataAdapter moet vullen met behulp van die command. Als je het zonder transacties doet, doe je ook maar 1 malig je tableAdapter vullen tijdens form_load en bij saven elke keer updaten.
whoami schreef op woensdag 04 april 2007 @ 13:00:
En wat bedoel je, dan doet ie de aanpassingen op z'n eigen dataset ?
Daar bedoel ik mee, dat als je een record wil invoegen wat mislukt, doet ie dan vervolgens weer een nieuwe insert ? of doet ie de huidige gegevens updaten (in de dataset waarmee je werkt). Niet dat het veel uitmaakt lijkt mij maar om het principe beter te begrijpen.

Verwijderd

Topicstarter
whoami schreef op woensdag 04 april 2007 @ 13:00:
Stel dat je dit niet doet (acceptchanges aanroepen (en dat doe je niet zie ik)), en stel je deze situatie voor:
je voegt een row toe aan je datatable; die row krijgt de RowState 'Added'.
Je klikt op save; je data-adapter ziet de RowState Added, en zal de INSERT uitvoeren voor die row.
Je doet geen call naar AcceptChanges.
Je wijzigt de row die je net toegevoegd had. Die RowState blijft echter op 'Added' staan.
Je saved; de DataAdapter doet opnieuw een INSERT van diezelfde row

Doe je echter wel een call naar Acceptchanges na je eerste save, dan zal de rowstate van die row op 'Modified' komen, en weet de DataAdapter dat hij een UPDATE moet doen, ipv een INSERT.

Echter, dit verklaart imho nog niet waarom je die bepaalde exceptie krijgt...
Als ik zonder transactie met databinding en datasets werk doe ik na een update nooit acceptchanges. Toch kan ik gewoon records toevoegen en updaten. Want als je een bestaande record aanklikt en die update, heb je altijd een where optie, daarop doet ie updaten.
Stel je hebt een datagridview en je wijzigt een van de records, je slaat op d.m.v. de update van de tableAdapter. Vervolgens pas je nog een attribuut aan en weer opslaan dat geeft geen problemen bij mij. En ik maak geen gebruik van AcceptChanges. Die dataset kijkt gewoon heb ik changes, zo ja sla alles op, ongeacht update of insert of delete.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Want als je een bestaande record aanklikt en die update, heb je altijd een where optie, daarop doet ie updaten.
:?
Wat bedoel je hier ? Ik heb zo'n beetje het bruin vermoeden dat je voor bepaalde dingen nog wat basic-kennis mist.....
Wat ik bedoel is: de DataAdapter bepaald of hij een INSERT of een UPDATE sql statement moet uitvoeren adhv de RowState van je DataRow.
Die dataset kijkt gewoon heb ik changes, zo ja sla alles op, ongeacht update of insert of delete.
Die DataSet kijkt niet wat hij moet doen; de DataAdapter kijkt wat hij moet doen. En die DataAdapter bepaalt per DataRow adhv de RowState van die DataRow of hij een DELETE / INSERT / UPDATE of niets moet uitvoeren.

Hoedanook; vang die exceptie eens op, en kijk eens of er wat te vinden is in de InnerException property.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik mis ongetwijfeld nog een stukje basis kennis, maar daarom leer ik ook van jullie, van jullie reacties en van internet voorbeelden en uitleg enzo. Op msdn waar ik heen gelinkt werd vanuit de exception stond inderdaad zoiets wat jij zei: controleer of de insert/update/delete commands correct zijn, anders kan de dataAdapter ze niet uitvoeren. Ik heb in ieder geval al een werkende oplossing maar ga toch nog eens ernaar kijken en die exceptie bestuderen.
In ieder geval erg bedankt voor de hulp en opmerkingen.
Pagina: 1