[C# - Winforms] Update Database

Pagina: 1
Acties:

  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Ik krijg het maar niet voorelkaar om de veranderingen die de gebruiker gemaakt heeft in een datagrid door te voeren in de database.

Ik gebruik de volgende code:
C#:
1
2
3
4
5
6
7
8
OleDbCommand selectCmd = new OleDbCommand("select * from " + listBox1.Text, db.connection);
dataAdapter = new OleDbDataAdapter();
dsTables = new DataSet();
dataAdapter.FillSchema(dsTables,SchemaType.Source,listBox1.Text);
dataAdapter.Fill(dsTables, this.database);
dataGrid1.DataSource = dsTables.Tables[this.database].DefaultView;
OleDbCommandBuilder custCB = new OleDbCommandBuilder(dataAdapter);
dataAdapter.UpdateCommand = custCB.GetUpdateCommand();


Verderop in de code ga ik updaten:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (dsTables.HasChanges())
            {
                try
                {
                    DataSet changedData = dsTables.GetChanges();                                                
                    int numRows = dataAdapter.Update(changedData, listBox1.Text);                                   
                    MessageBox.Show(numRows + " rows changed");         
                    
                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }


                
            }       


Wat ik ook doe, elke keer wordt er niet geupdate, terwijl er toch degelijk veranderingen zijn.

Ik krijg geen errors of exceptions

Iemand een idee?

Wat niet kan is nog nooit gebeurd


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
^Kick^

Wat niet kan is nog nooit gebeurd


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Hoe ziet je updatecommand eruit?
Hoe zit het met de parameters van dat updatecommand , zijn ze aan de juiste columns enzo gebinded?

https://fgheysels.github.io/


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Volgens mij wel. Ik genereer ze via de OleDbCommandBuilder.
Ik heb de selectCommand gezet. Volgens de documentatie worden de update, insert en delete commando's dan automatisch gebruikt.

Zal eens een breakpoint op de update zetten, eve kijken hoe die update eruit ziet.
[ik krijg overigens geen error !]

Wat niet kan is nog nooit gebeurd


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Ga je mij nu vertellen dat je zelf nog niet eerst eens even de moeite hebt genomen om het geheel eens te debuggen?

https://fgheysels.github.io/


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
:o Niet helemaal.

De update query is een parameterized query. Ten minste op mijn gezette breakpoint. Wanneer ik verder stap, gaat het programma gewoon door. geen exception of iets dergelijks.

Ik ging er een beetje vanuit dat de ADO.NET functies er voor zorgen dat de juiste waarden ingevuld zullen worden.

VB:
code:
1
UPDATE overzicht SET azg = ? , afd no = ? , diagnose = ? , gelst = ? , CPK/neurol = ? , biopt = ? , familiair = ? , ernst = ? , linkage = ? , LMNA = ? , DSG = ? WHERE ( (Id = ?) AND ((? = 1 AND azg IS NULL) OR (azg = ?)) AND ((? = 1 AND afd no IS NULL) OR (afd no = ?)) AND ((? = 1 AND diagnose IS NULL) OR (diagnose = ?)) AND ((? = 1 AND gelst IS NULL) OR (gelst = ?)) AND ((? = 1 AND CPK/neurol IS NULL) OR (CPK/neurol = ?)) AND ((? = 1 AND biopt IS NULL) OR (biopt = ?)) AND ((? = 1 AND familiair IS NULL) OR (familiair = ?)) AND ((? = 1 AND ernst IS NULL) OR (ernst = ?)) AND ((? = 1 AND linkage IS NULL) OR (linkage = ?)) AND ((? = 1 AND LMNA IS NULL) OR (LMNA = ?)) AND ((? = 1 AND DSG IS NULL) OR (DSG = ?)) )


Ik kan niet bij het commando komen op het exacte moment dat het uitgevoerd wordt.

Ik zal nog wat meer debug uurtjes maken :Y)

[ Voor 46% gewijzigd door Nexopheus op 02-09-2003 15:24 ]

Wat niet kan is nog nooit gebeurd


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Normaal gezien moeten de parameters van je query 'gebinded' worden aan een source-column. (Bekijk de constructor van een OleDbParameter eens). Aangezien je gebruik maakt vn die commandbuilder zou ik ook vermoeden dat dit automatisch moet gebeuren.

Kan het te maken hebben met het feit dat je select * doet ? (* whoami roept maar wat)

https://fgheysels.github.io/


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Je bedoelt ipv * alle kolomnamen van de database?

Wat niet kan is nog nooit gebeurd


  • LoekD
  • Registratie: Augustus 2000
  • Laatst online: 09-08 16:24
Kijk eens naar dataAdapter.UpdateCommand.CommandText,
wat staat daar zoal in?
Als je het daar niet mee eens bent kun je die overschrijven met je eigen statement.

En heb je niet p.o. dsTables.AcceptChanges() aangeroepen voordat je je update gedaan hebt?

loading...


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
die text (dus updatecommand.commandtext) heb ik hierboven al geplaatst.
het gaat er juist op dat het dynamisch gebeurt. Ik heb geen idee wat voor tabel er geladen wordt. Dus handmatig aanpassen is niet echt een optie

Wat niet kan is nog nooit gebeurd


  • LoekD
  • Registratie: Augustus 2000
  • Laatst online: 09-08 16:24
Zoals je ziet is het gegenereerde Update statement niet goed.
Dat kan betekenen dat je listBox1.Text leeg is op het moment dat het OleDbCommand object gemaakt wordt.
Vul daar eens een bestaande tabelnaam in.

loading...


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Daar staat al een bestaande tabelnaam in. De datagrid wordt gevuld adhv de waarde in deze listbox.

Wat niet kan is nog nooit gebeurd


  • LoekD
  • Registratie: Augustus 2000
  • Laatst online: 09-08 16:24
ohja.. en:
After the SQL statement is first generated, the application must explicitly call RefreshSchema if it changes the statement in any way. Otherwise, the GetUpdateCommand will be still be using information from the previous statement, which might not be correct. The SQL statements are first generated either when the application calls Update or GetUpdateCommand.

[ bron: ms-help://MS.NETFrameworkSDKv1.1/cpref/html/frlrfsystemdataoledboledbcommandbuilderclassgetupdatecommandtopic.htm ]

loading...


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
mmm, zal deze eens proberen

Is enkel nodig wanneer de select statement is gewijzigd.
--> toch niet, Beter zoeken in de help.
Remarks
An application should call RefreshSchema whenever the SELECT statement associated with the OleDbCommandBuilder changes.

An application should call RefreshSchema whenever the SelectCommand value of the OleDbDataAdapter changes.
bron: ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1033/cpref/html/frlrfSystemDataOleDbOleDbCommandBuilderClassRefreshSchemaTopic.htm

[ Voor 107% gewijzigd door Nexopheus op 02-09-2003 17:09 ]

Wat niet kan is nog nooit gebeurd


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Krijg nu in iedergeval een syntax error exception. En er komt ook een mooi rood kruisje in de datagrid te staan. De query is helemaal niet goed, lijkt helemaal nergens naar. Nog steeds die rare vraag tekens.

Snap er helemaal niets van.....! |:(

Dan toch maar de command objecten zelf maken.

code:
1
"UPDATE Tabel1 SET famno = ? , overleden = ? , afd no = ? , diagnose = ? , gelst = ? , CPK/neurol = ? , biopt = ? , familiair = ? , ernst = ? , DNA? = ? , linkage = ? , LMNA = ? , delta SG = ? , Veld3 = ? , Veld2 = ? , Veld1 = ? , genealogie = ? WHERE ( (Id = ?) AND ((? = 1 AND famno IS NULL) OR (famno = ?)) AND ((? = 1 AND overleden IS NULL) OR (overleden = ?)) AND ((? = 1 AND afd no IS NULL) OR (afd no = ?)) AND ((? = 1 AND diagnose IS NULL) OR (diagnose = ?)) AND ((? = 1 AND gelst IS NULL) OR (gelst = ?)) AND ((? = 1 AND CPK/neurol IS NULL) OR (CPK/neurol = ?)) AND ((? = 1 AND biopt IS NULL) OR (biopt = ?)) AND ((? = 1 AND familiair IS NULL) OR (familiair = ?)) AND ((? = 1 AND ernst IS NULL) OR (ernst = ?)) AND ((? = 1 AND DNA? IS NULL) OR (DNA? = ?)) AND ((? = 1 AND linkage IS NULL) OR (linkage = ?)) AND ((? = 1 AND LMNA IS NULL) OR (LMNA = ?)) AND ((? = 1 AND delta SG IS NULL) OR (delta SG = ?)) AND ((? = 1 AND Veld3 IS NULL) OR (Veld3 = ?)) AND ((? = 1 AND Veld2 IS NULL) OR (Veld2 = ?)) AND ((? = 1 AND Veld1 IS NULL) OR (Veld1 = ?)) AND ((? = 1 AND genealogie IS NULL) OR (genealogie = ?)) )"

Hieboven nogmaals de update sql. Bagger is het.

[ Voor 67% gewijzigd door Nexopheus op 02-09-2003 17:22 ]

Wat niet kan is nog nooit gebeurd


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Of moet ik zelf nog eerst de parameter waardes invoeren ?

Wat niet kan is nog nooit gebeurd


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Het is opgelost hoor!!!!
Deze regeltjes doen het!
code:
1
2
3
OleDbCommandBuilder custCB = new OleDbCommandBuilder(custDA);
custCB.QuotePrefix = "[";
custCB.QuoteSuffix = "]";


Raar maar waar!

Wat niet kan is nog nooit gebeurd


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
En kan je er ook nog ff wat meer uitleg bij geven? :?

Ah, ik zie het al.... Het probleem heeft te maken met het feit dat jij spaties in je veldnamen zitten hebt.
Eigenlijk is dat een bad practice. Nooit spaties in je columnnames gebruiken. Gebruik dan underscores ofzo.

[ Voor 68% gewijzigd door whoami op 02-09-2003 21:44 ]

https://fgheysels.github.io/


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Ik wou dat ik dat kon! :)

Ik heb nog maar eens gezocht in de VS.NET Help files. Hier kwam ik een stukje tegen met de titel:"
"Automatically Generated Commands" Alles wat hierin stond deed ik dus al, behalve die prefix en suffix niet.

Ik heb vervolgens een nieuwe applicatie gemaakt waarbij ik alles letterlijk over heb getyped.
zoals het in de help stond:
zie hieronder voor de code
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
OleDbDataAdapter custDA;
        OleDbConnection nwindConn;
        DataSet custDS = new DataSet();
        private void button1_Click(object sender, System.EventArgs e)
        {
            nwindConn  = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\DCM.mdb");
            nwindConn.GetOleDbSchemaTable(
            custDA = new OleDbDataAdapter("SELECT * FROM Tabel1",nwindConn);
            OleDbCommandBuilder custCB = new OleDbCommandBuilder(custDA);
            custCB.QuotePrefix = "[";
            custCB.QuoteSuffix = "]";
            
            nwindConn.Open();           
            custDA.Fill(custDS,"Tabel1");                       
            
            dataGrid1.DataSource = custDS;
            dataGrid1.DataMember = "Tabel1";    


        }

        private void button2_Click(object sender, System.EventArgs e)
        {
            custDA.Update(custDS,"Tabel1");         
            nwindConn.Close();          
        }


Bovenstaande code heb ik een beetje aangepast nadat ik bewijs had dat het werkte.
Wanneer ik de prefix en suffix weghaal, lukt het niet meer.

De query heeft nu de volgende vorm:
code:
1
"UPDATE [Tabel1] SET [famno] = ? , [overleden] = ? , [afd no] = ? , [diagnose] = ? , [gelst] = ? , [CPK/neurol] = ? , [biopt] = ? , [familiair] = ? , [ernst] = ? , [DNA?] = ? , [linkage] = ? , [LMNA] = ? , [delta SG] = ? , [Veld3] = ? , [Veld2] = ? , [Veld1] = ? , [genealogie] = ? WHERE ( ([Id] = ?) AND ((? = 1 AND [famno] IS NULL) OR ([famno] = ?)) AND ((? = 1 AND [overleden] IS NULL) OR ([overleden] = ?)) AND ((? = 1 AND [afd no] IS NULL) OR ([afd no] = ?)) AND ((? = 1 AND [diagnose] IS NULL) OR ([diagnose] = ?)) AND ((? = 1 AND [gelst] IS NULL) OR ([gelst] = ?)) AND ((? = 1 AND [CPK/neurol] IS NULL) OR ([CPK/neurol] = ?)) AND ((? = 1 AND [biopt] IS NULL) OR ([biopt] = ?)) AND ((? = 1 AND [familiair] IS NULL) OR ([familiair] = ?)) AND ((? = 1 AND [ernst] IS NULL) OR ([ernst] = ?)) AND ((? = 1 AND [DNA?] IS NULL) OR ([DNA?] = ?)) AND ((? = 1 AND [linkage] IS NULL) OR ([linkage] = ?)) AND ((? = 1 AND [LMNA] IS NULL) OR ([LMNA] = ?)) AND ((? = 1 AND [delta SG] IS NULL) OR ([delta SG] = ?)) AND ((? = 1 AND [Veld3] IS NULL) OR ([Veld3] = ?)) AND ((? = 1 AND [Veld2] IS NULL) OR ([Veld2] = ?)) AND ((? = 1 AND [Veld1] IS NULL) OR ([Veld1] = ?)) AND ((? = 1 AND [genealogie] IS NULL) OR ([genealogie] = ?)) )"


Blijkbaar zijn de haken nodig voor verder verwerking...

[ Voor 3% gewijzigd door Nexopheus op 02-09-2003 21:51 ]

Wat niet kan is nog nooit gebeurd


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Die haken zijn nodig omdat -zoals ik al zei- je spaties hebt in je column-names.
Als je die niet hebt, dan heb je die haken niet nodig.

(Vergelijk het met de backticks in MySQL)

[ Voor 15% gewijzigd door whoami op 02-09-2003 22:42 ]

https://fgheysels.github.io/


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Justum, weer wat wijzer.

Wat niet kan is nog nooit gebeurd

Pagina: 1