[C#/SQL] TableAdapter update werkt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Stekeltje
  • Registratie: November 2005
  • Laatst online: 17-09 16:25

Stekeltje

Nothing to see here move along

Topicstarter
Hallo,

Ik ben bezig met een project waarin een server based database wordt gebruikt, tot nu heb ik alleen nog maar functies nodig gehad waarin informatie uit de database werd gehaald.

Echter loop ik nu tegen het probleem hoe krijg ik veranderde data nou terug in de database (Merge?)

Bijvoorbeeld:
Bij een formload wordt de volgende actie gedaan:
C#:
1
2
3
4
5
6
            // Hier wordt er een connectie gemaakt tussen Database en het programma. 
            SqlConnection fillForm = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\CabSofDataBase.mdf;Integrated Security=True;User Instance=True");
            //Hier wordt er een sql query naar de database gestuurd.
            SqlCommand cmd = new SqlCommand("SELECT * FROM devicestable WHERE TiatID = '" + TiatID + "'", fillForm);
            SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(cmd);
            sqlDataAdapter.Fill(this.cabSofDataBaseDataSet.devicestable);


Waarin een String wordt meegestuurd vanuit een andere Form waardoor er een specifieke gegevens worden opgehaald. (Ik kom uit een datagridview en ik heb elke keer maar 1 specifiek record nodig.

Dat lukt helemaal goed dus dat is het probleem ook niet.

Maar stel, Het record heeft een andere calibratie datum gekregen ipv 2010 is het nu 2011 geworden, dan wil ik dat kunnen opslaan richting de database.

Het volgende stukje werkt niet:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            try
            {
                if (MessageBox.Show("Weet u zeker dat u deze veranderingen wilt opslaan?", "Pas op!", MessageBoxButtons.OKCancel) == DialogResult.OK)
                {
                    cabSofDataBaseDataSet.GetChanges(DataRowState.Modified);
                    devicestableTableAdapter.Update(cabSofDataBaseDataSet);
                }
                else
                {
                    MessageBox.Show("De veranderingen zijn niet opgeslagen!");
                }
            }
            catch
            {
                MessageBox.Show("The changes can't be saved please try again.");
            }


Wat doe ik fout, moet ik specifiek alle tekst invoer velden gaan opgeven en alle datum boxen?
Moet ik deze dan sturen naar een Datatable en moet ik die dan mergen met de huidige database?

Ik zie door de bomen het bos niet goed meer en volgens mij zie ik wat grote dingen compleet over het hoofd.

De volgende links heb ik wel gevonden maar veel soep kan ik er (nog) niet van maken.
http://msdn.microsoft.com/en-us/library/5dxfaha8.aspx
http://msdn.microsoft.com/en-us/library/bb386870.aspx

Ps.
Ik gebruik Visual Studio Ultimate 2010
De data wordt gebind met een BindingSource en en TableAdapter

Ps2
Willen jullie alsjeblieft geen big deal maken van het feit dat er geen LINQ of een ander soort binding is gebruikt. Deze is voor mij het prettigst werken en de database bevat te weinig records om snelheid verlies te merken.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
...Ruud... schreef op maandag 03 januari 2011 @ 09:15:
Het volgende stukje werkt niet:
...
Wat doe ik fout
Nou, allereerst vermeld je niet wat er niet werkt. Krijg je een foutmelding (en zo ja: welke?), worden de wijzigingen niet opgeslagen, krijg je een bluescreen of kom je in een parallel universum terecht :? Heb je al gedebugged? (Debuggen: Hoe doe ik dat?)
...Ruud... schreef op maandag 03 januari 2011 @ 09:15:
Ps2
Willen jullie alsjeblieft geen big deal maken van het feit dat er geen LINQ of een ander soort binding is gebruikt. Deze is voor mij het prettigst werken en de database bevat te weinig records om snelheid verlies te merken.
Whuh? Wat is dit voor onzin? Alsof LINQ sneller zou zijn en alsof LINQ de silver bullet voor alles is. Ik zie niet waarom hier een big deal van gemaakt zou worden. Het is dan ook weinig zinnig zulk een opmerking in je topic te zetten. Als mensen met alternatieven komen aanzetten is daar meestal een goede reden voor (en dus leerzaam voor jou) en als je 't er niet mee eens bent kun je er nog altijd voor kiezen 't te negeren ;)

[ Voor 17% gewijzigd door RobIII op 03-01-2011 12:02 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Stekeltje
  • Registratie: November 2005
  • Laatst online: 17-09 16:25

Stekeltje

Nothing to see here move along

Topicstarter
RobIII schreef op maandag 03 januari 2011 @ 12:01:
[...]

Nou, allereerst vermeld je niet wat er niet werkt. Krijg je een foutmelding (en zo ja: welke?), worden de wijzigingen niet opgeslagen, krijg je een bluescreen of kom je in een parallel universum terecht :? Heb je al gedebugged? (Debuggen: Hoe doe ik dat?)

Woops, sorry helemaal vergeten, zodra ik debug en het programma start om de functie te testen. Wanneer de button 1 maal wordt geklikt gebeurd er niets, de button is ingedrukt en dat is het, hij komt niet in else (want ik klik OK).

Zodra ik dan het venster sluit waar de knop in staat en opnieuw open dan is de record niet veranderd. De database blijft ongewijzigd.

[...]

Whuh? Wat is dit voor onzin? Alsof LINQ sneller zou zijn en alsof LINQ de silver bullet voor alles is. Ik zie niet waarom hier een big deal van gemaakt zou worden. Het is dan ook weinig zinnig zulk een opmerking in je topic te zetten. Als mensen met alternatieven komen aanzetten is daar meestal een goede reden voor (en dus leerzaam voor jou) en als je 't er niet mee eens bent kun je er nog altijd voor kiezen 't te negeren ;)

De vorige keer dat ik een database vraag het gesteld ontstond er 2 pagina's lang uit het niets een discussie waarin ik niet eens aan deelnam over waarom ik veel beter andere bindings kan gebruiken vanwege performance. Dit topic is niet bedoeld voor een alternatieve binding maar om een probleem op te lossen waarbij ik dus wilde voorkomen om weer een discussie opgang te brengen ;)

Acties:
  • 0 Henk 'm!

  • Stekeltje
  • Registratie: November 2005
  • Laatst online: 17-09 16:25

Stekeltje

Nothing to see here move along

Topicstarter
Ik heb een stukje van MSDN gevonden waarin het volgende stond:
C#:
1
2
3
4
5
6
7
8
9
10
11
try
{
    this.Validate();
    this.customersBindingSource.EndEdit();
    this.customersTableAdapter.Update(this.northwindDataSet.Customers);
    MessageBox.Show("Update successful");
}
catch (System.Exception ex)
{
    MessageBox.Show("Update failed");
}

Dit werkt echter niet ik krijg een exception bij de TableAdapter.Update -> Hij zegt dat het command invalid is.

Hierna heb ik geprobeerd om via de tableadapter manager de update te doen maar daar kreeg ik de volgende exception:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
try
            {
                if (MessageBox.Show("Weet u zeker dat u deze veranderingen wilt opslaan?", "Pas op!", MessageBoxButtons.OKCancel) == DialogResult.OK)
                {
                    this.Validate();
                    this.devicestableBindingSource.EndEdit();
                    this.tableAdapterManager.UpdateAll(this.cabSofDataBaseDataSet);
                }
                else
                {
                    MessageBox.Show("De veranderingen zijn niet opgeslagen!");
                }
            }
            catch (Exception ex)
            {
             
                MessageBox.Show("De veranderingen kunnen helaas niet worden opgeslagen.", "Pas op!");
            }

Exception:
Afbeeldingslocatie: http://www.ruud-martens.nl/foutmelding.png

De volgende links helpen mij niet echt maar misschien kunnen jullie er iets mee?:
http://msdn.microsoft.com...DevLang-CSHARP%29&rd=true
http://msdn.microsoft.com...at996zc%28v=vs.80%29.aspx
http://msdn.microsoft.com...DevLang-CSHARP%29&rd=true

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Begin eens met first things first: hoe zie je updatecommand er uit als 'ie er steeds over klaagt?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Stekeltje
  • Registratie: November 2005
  • Laatst online: 17-09 16:25

Stekeltje

Nothing to see here move along

Topicstarter
Het probleem is al opgelost:
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
32
33
34
35
            try
            {
                if (MessageBox.Show("Weet u zeker dat u deze bewerkingen wilt opslaan?", "Pas op!", MessageBoxButtons.OKCancel) == DialogResult.OK)
                {
                    //Hier wordt er een connectie gemaakt tussen Database en het programma. 
                    SqlConnection updateForm = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\CabSofDataBase.mdf;Integrated Security=True;User Instance=True");
                    //Hier wordt er een sql query gedefineerd edn de connectie met de database geopend.
                    updateForm.Open();
                    SqlCommand update = new SqlCommand("UPDATE devicestable SET Components ='"      + componentsTextBox.Text +
                                                                           "' , Calibrationdate = '"+ calibrationdateDateTimePicker.Value.ToString("MM/dd/yyyy") +
                                                                           "' , Calibrationdue =  '" + calibrationdueDateTimePicker.Value.ToString("MM/dd/yyyy") +
                                                                           "' , Note =            '" + noteTextBox.Text + 
                                                                           "' , Location =        '" + locationTextBox.Text +
                                                                           "' , [User] =          '" + userTextBox.Text +
                                                                           "' , [Loaned to] =     '" + loaned_toTextBox.Text +
                                                                           "' , NENdate =         '" + nENdateDateTimePicker.Value.ToString("MM/dd/yyyy") +
                                                                           "' , NENdue =          '" + nENdueDateTimePicker.Value.ToString("MM/dd/yyyy") +
                                                                           "'   WHERE TiatID =    '" + TiatID + "'", updateForm);
                    //Hier wordt de query uitgevoerd.
                    update.ExecuteNonQuery();
                    //De gebruiker krijgt een notificatie zodra de query succesvol is gedaan.
                    MessageBox.Show("De bewerking is succesvol opgeslagen!", "Saved.");
                    // Hier wordt de connectie dichtgezet.
                    updateForm.Close();
                }
                else
                {
                    MessageBox.Show("De bewerking is niet opgeslagen!" , "Failed to Save.");
                }
            }
            catch (Exception ex)
            {
             
                MessageBox.Show("De veranderingen kunnen helaas niet worden opgeslagen.", "Pas op!");
            }


Ik heb gewoon handmatig geconnect met de database en een query gestuurd. De datetimepicker boxen moet je wel converteren naar iets wat de database snapt. De exacte code die je nodig hebt kan je Hier terug vinden.

[ Voor 5% gewijzigd door Stekeltje op 05-01-2011 14:05 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je huidige manier is niet echt veilig. Op deze manier ben je kwetsbaar voor SQL Injection. Je kunt beter gebruik maken van http://msdn.microsoft.com...lclient.sqlparameter.aspx, dan hoef je je zelf niet bezig te houden met escaping (wat betreft de database)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Stekeltje
  • Registratie: November 2005
  • Laatst online: 17-09 16:25

Stekeltje

Nothing to see here move along

Topicstarter
Sql injection slaat op het feit als deze applicatie op het web zou rond zwerven neem ik aan? Dit is een applicatie voor mijn stage bedrijf de software is zo specifiek op 3 (kleine) bedrijven gericht dat ik me geen zorgen hoef te maken over een sql injection.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
...Ruud... schreef op woensdag 05 januari 2011 @ 14:56:
is zo specifiek op 3 (kleine) bedrijven gericht dat ik me geen zorgen hoef te maken over een sql injection.
Famous last words.
Je moet je altijd, no exceptions, zorgen maken om SQL injections.

[ Voor 13% gewijzigd door RobIII op 05-01-2011 15:00 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Stekeltje
  • Registratie: November 2005
  • Laatst online: 17-09 16:25

Stekeltje

Nothing to see here move along

Topicstarter
RobIII schreef op woensdag 05 januari 2011 @ 15:00:
[...]

Famous last words.
Je moet je altijd, no exceptions, zorgen maken om SQL injections.
Serieus, dan zal ik als de tijd het toelaat enkele gedeelte aanpassen om ze te bewaken tegen SQL injections.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
...Ruud... schreef op woensdag 05 januari 2011 @ 15:06:
[...]

Serieus, dan zal ik als de tijd het toelaat enkele gedeelte aanpassen om ze te bewaken tegen SQL injections.
Serieus ja ;)
Je zult alle plekken waar SQL statements gebruikt worden moeten nalopen en een wijze les voor de volgende keer: hou er vanaf 't begin rekening mee, dan hou je naderhand niet dat je perongeluk 1 plek over het hoofd ziet (want that's all it takes om alsnog je hele DB op straat te krijgen met wat pech).
Tip: Parameterized queries (zie Woy).

[ Voor 7% gewijzigd door RobIII op 05-01-2011 15:09 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Stekeltje
  • Registratie: November 2005
  • Laatst online: 17-09 16:25

Stekeltje

Nothing to see here move along

Topicstarter
RobIII schreef op woensdag 05 januari 2011 @ 15:08:
[...]

Serieus ja ;)
Je zult alle plekken waar SQL statements gebruikt worden moeten nalopen en een wijze les voor de volgende keer: hou er vanaf 't begin rekening mee, dan hou je naderhand niet dat je perongeluk 1 plek over het hoofd ziet (want that's all it takes om alsnog je hele DB op straat te krijgen met wat pech).
Tip: Parameterized queries (zie Woy).
Oke, thanks, ik leer op school niet hoe je beveiligingen in software zet en hoe je kan voorkomen dat het gebeurd, ik studeer zelf elektrotechniek maar het huidige programma dat ze hebben is zo krak dat ik het wel moest verbeteren.

Thanks voor de tip!

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
SQL Injection hoeft niet altijd kwade opzet te zijn. Hoewel het niet echt aan het "Injection" gedeelte voldoet, treed het ook al op als een gebruiker in een van de velden een ' intypt. Er zal dan niet direct allerlei data verwijderd worden, maar je query zal wel mislukken, want je hebt dan een malformed query.

Sowieso is het altijd verstandig om bij elke overgang/communicatie van een systeem/omgeving naar een ander systeem na te denken over escaping. SQL Injection is maar een van de voorbeelden waar dat nodig is. Als je bijvoorbeeld HTML output, zul je rekening moeten houden met speciale HTML characters. Als je mails stuurt, zul je moeten zorgen dat er niet per ongeluk een header verkeerd afgesloten word, als je een soap web-service aanspreekt zal je XML ook wel-formed moeten zijn. Zo kom je het eigenlijk op alle plekken wel tegen.

Het is dus niet verkeerd om je elke keer als je met een ander systeem communiceert af te vragen of je daar nog iets van escaping moet doen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Sowieso duid je "workaround" erop dat je gewoonweg iets verkeerds doet. Je gaat eerst een dataadapter gebruiken om je Data Accces mee te doen, om vervolgens handmatig updates weg te schieten...

De fout die je omschrijft is helaas een niet al te handige foutmelding. Er kunnen meerdere redenen zijn waarom je die fout krijgt, een fout op je updatecommand is helaas maar een gevolg van een van die redenen, en vaak niet de daadwerkelijke oorzaak.

Hoe kom je aan de dataset/table die je aan de adapter geeft? Heb je deze via de wizards automatisch laten genereren? DataAdapters zijn overigens behoorlijk oude koek, dat is niet negatief bedoeld, maar meer een aanduiding dat er veel over te vinden valt.

En dus ook over jou Update foutmelding.

De fout is redelijk standaard aanduiding dat er iets in de datatable niet goed zit. Of er is een foutje ingeslopen bij het genereren uit acces (wat om allerlei redenen stilletjes fout kan gaan) of omdat er ongeldige data in zit (die fout kan je vaak vinden door de innerexception property van je exception te raadplegen).

Kortom, geef t niet op je bent dichtbij en zoals Woy en RobIII al zeggen, gebruik in godsnaam prepared statements. Het is een hele kleine moeite als je toch al op de handmatige toer gaat.Dat gezegd, als je de dataAdapter gebruikt voor het updaten/inserten dan hoeft dat niet meer, deze doet dit al voor je.

[ Voor 10% gewijzigd door D-Raven op 06-01-2011 20:24 ]

Pagina: 1