Toon posts:

[C#] Datagrid: Automatische waarde bij "Insert"

Pagina: 1
Acties:

Verwijderd

Topicstarter
De oplossing voor mijn probleem is ongetwijfeld erg eenvoudig, maar ik kan m na een hoop gezoek en uitgeprobeer ff niet vinden...mijn probleem:

Ik ben een progje aan het maken in C# (Windows forms) waar ik een 5-tal datagrids gebruik (verdeeld over tabpages in een tabcontrol) gekoppeld aan een access database. Ik maak gebruik van 5 OleDbDataAdapters en 1 DataSet met 5 DataTables. Ik heb voor het gemak de DataAdapters zelf maar de Insert, Update en Delete statements laten genereren, wat op zich goed werkt. Maarrrr...

In ieder van de 5 tabellen zit een veld "fDate" waar de datum in moet komen staan die op het moment van het uitvoeren van het Insert-statement in een DateTimePicker geselecteerd is (uiteraard moet bij het selecteren van een andere datum in de DateTimePicker ook alleen de records zichtbaar zijn van die bewuste datum, maar dat gedeelte is geen probleem). Nou dacht ik dat te doen door het gegenereerde Insert-statement handmatig aan te passen en van de datum in de DateTimePicker gebruik te laten maken, maar VS.Net 2003 vervangt mijn

code:
1
     " + this.dateTimePicker.ToShort() + "


gewoon door de huidige datum, wat dus niet de bedoeling is. Toen heb ik geprobeerd om handmatig de OleDbParameters voor de datum-velden aan te passen zodat deze de waarde uit de DateTimePicker gebruiken, maar ook deze aanpassing wordt door VS.Net keihard vervangen door de huidige datum.

Mijn vraag zal al duidelijk zijn denk ik: Hoe kan ik ervoor zorgen dat de waarde uit de DateTimePicker automatisch gebruikt wordt voor het vullen van het "fDate"-veld wanneer er een Insert-query wordt uitgevoerd?

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Allereerst, maak gebruik van parametrized queries ipv je queries dmv string concatenatie te gaan opbouwen.

Ten 2de moet je natuurlijk ook nog de geselecteerde datum kiezen:
code:
1
myDateTimePicker.Value

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ten 2de moet je natuurlijk ook nog de geselecteerde datum kiezen:
Ja, ok...dat heb ik hierboven ff fout getyped, maar in mijn code staat het wel goed...

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Staat die DateTimepicker op je form, of in je datagrid?

Post anders eens wat relevante code (geen onnodige lappen dus). Bv, hoe je query is samengesteld.

https://fgheysels.github.io/


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

myDateTimePicker.Value geeft een date-timeobject terug. Om 'm in je query te krijgen zal je d'r toch ff tekst van moeten maken: myDateTimePicker.Value.ToString() dus.

En dan moet je je gaan afvragen of dat precieze format wel door je db wordt ondersteund.

Gokje: nee :)


Journalism is printing what someone else does not want printed; everything else is public relations.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Rataplan schreef op 12 augustus 2003 @ 15:29:
myDateTimePicker.Value geeft een date-timeobject terug. Om 'm in je query te krijgen zal je d'r toch ff tekst van moeten maken: myDateTimePicker.Value.ToString() dus.

En dan moet je je gaan afvragen of dat precieze format wel door je db wordt ondersteund.

Gokje: nee :)
Dat zal het inderdaad zijn.
Door gebruik te maken van parametrized queries kan je dat probleem mooi oplossen.

code:
1
2
3
4
5
6
7
string sSQL = "INSERT INTO tabel (veld1, veld2) VALUES (@p_v1, @p_v2)";
OleDbCommand cmd = new OleDbCommand( conn );
cmd.CommandText = sSQL;
cmd.Parameters.Add ("@p_v1", OleDbType.DateTime);
cmd.Parameters["@p_v1"].Value = DateTimePicker1.Value;
...
cmd.ExecuteNonQuery();

[ Voor 24% gewijzigd door whoami op 12-08-2003 15:32 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Die DateTimePicker staat op mijn form...hier een voorbeeld van 1 van de insert query's:

code:
1
2
3
4
5
6
7
8
9
10
this.oleDbInsertCommand2.CommandText = 
     "INSERT INTO TReparaties(fArbeidsloon, fBonNr, fDatum, fOmschrijving, fPrijsOnderdelen)  
       VALUES (?, ?, ?, ?, ?)";
this.oleDbInsertCommand2.Connection = this.oleDbConnection;

this.oleDbInsertCommand2.Parameters.Add(new System.Data.OleDb.OleDbParameter("fArbeidsloon", System.Data.OleDb.OleDbType.Currency, 0, "fArbeidsloon"));
this.oleDbInsertCommand2.Parameters.Add(new System.Data.OleDb.OleDbParameter("fBonNr", System.Data.OleDb.OleDbType.VarWChar, 50, "fBonNr"));
this.oleDbInsertCommand2.Parameters.Add(new System.Data.OleDb.OleDbParameter("fDatum", this.dateTimePicker.Value.ToShortDateString()));
this.oleDbInsertCommand2.Parameters.Add(new System.Data.OleDb.OleDbParameter("fOmschrijving", System.Data.OleDb.OleDbType.VarWChar, 150, "fOmschrijving"));
this.oleDbInsertCommand2.Parameters.Add(new System.Data.OleDb.OleDbParameter("fPrijsOnderdelen", System.Data.OleDb.OleDbType.Currency, 0, "fPrijsOnderdelen"));


en wat nou het probleem is, is dat VS.Net dit stukje:

code:
1
this.oleDbInsertCommand2.Parameters.Add(new System.Data.OleDb.OleDbParameter("fDatum", this.dateTimePicker.Value.ToShortDateString()));


vervangt door

code:
1
this.oleDbInsertCommand2.Parameters.Add(new System.Data.OleDb.OleDbParameter("fDatum", "8/12/2003"));


Dit heeft waarschijnlijk te maken met het feit dat deze code zich in het
code:
1
#region Windows Form Designer generated code

gedeelte bevindt. Maar waar moet ik de handmatige wijzigingen anders zetten?

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Tuurlijk. Er staat toch ook 'Windows Form Designer generated code.

Daar ga je dus je eigen code NIET zetten. Je weet nl. nooit wat er mee gebeurd.

Verder hoef je de Value van je DateTimePicker niet te converten als je hem aan een parameter toewijst.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ok...maar op het moment dat ik van de optie gebruik maak om de dataadapters zelf de code te laten genereren voor de insert, update en delete-query's, zet-ie die query's (uiteraard) in die 'Windows Form Designer generated code' neer. Als ik dan niks handmatig wijzig in dat gedeelte van de code, hoe zorg ik er dan voor dat-ie bij iedere insert-query automatisch het veld "fDatum" vult met de waarde van de DateTimePicker?
Of is het gewoon onverstandig om die query's automatisch te laten genereren en zou ik ze gewoon zelf moeten opbouwen?

  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

whoami schreef op 12 augustus 2003 @ 15:39:
Verder hoef je de Value van je DateTimePicker niet te converten als je hem aan een parameter toewijst.
Dat lijkt me zwak uitgedrukt. De gebruikte conversie is volstrekt arbitrair. Wie zegt dat die ShortDateString door de db goed geinterpreteerd wordt? Door het juiste db-interface te kiezen omzeil je dit soort problemen, en in noodgevallen (whoami gaat nu boos worden) mag je van mij best een string met het db-format aanmaken. Gewoon "een" datestring maken heeft geen zin.

Verder vind ik this.DateTimePicker. een beetje een vaag object - wat is er met MyDateTimePicker gebeurd?

Edit: volgens mij is dat ook wat er met de autogeneratie fout gaat. this.DateTimePicker heeft volgens mij geen r*k met je control te maken.

Ik dacht al, dit compileert voor geen meter :+

[ Voor 18% gewijzigd door Rataplan op 12-08-2003 15:51 ]


Journalism is printing what someone else does not want printed; everything else is public relations.


Verwijderd

Topicstarter
this.DateTimePicker
this.dateTimePicker he...als ik weet dat ik van een bepaalde class/control maar 1 object nodig heb, pak ik meestal gewoon de naam van de class en vervang alleen de hoofdletter aan het begin door een kleine letter...zodoende...

[ Voor 12% gewijzigd door Verwijderd op 12-08-2003 15:49 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Rataplan schreef op 12 August 2003 @ 15:45:
[...]

Dat lijkt me zwak uitgedrukt. De gebruikte conversie is volstrekt arbitrair. Wie zegt dat die ShortDateString door de db goed geinterpreteerd wordt? Door het juiste db-interface te kiezen omzeil je dit soort problemen, en in noodgevallen (whoami gaat nu boos worden) mag je van mij best een string met het db-format aanmaken. Gewoon "een" datestring maken heeft geen zin.
Als je gewoon dit doet:
code:
1
OleDbCommand1.Parameters["@p_eendatum"].Value = dateTimePicker1.Value;

zal alles gewoon goed gaan. Test het maar eens uit.

https://fgheysels.github.io/


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

whoami schreef op 12 August 2003 @ 15:52:
[...]

Als je gewoon dit doet:
code:
1
OleDbCommand1.Parameters["@p_eendatum"].Value = dateTimePicker1.Value;

zal alles gewoon goed gaan. Test het maar eens uit.
offtopic:
Als ik het me goed herinner moet 'ie dan geen MSSQL-server via ado aanspreken :)

[ Voor 5% gewijzigd door Rataplan op 12-08-2003 15:57 ]


Journalism is printing what someone else does not want printed; everything else is public relations.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Rataplan schreef op 12 augustus 2003 @ 15:56:
[...]
offtopic:
Als ik het me goed herinner moet 'ie dan geen MSSQL-server via ado aanspreken :)
Hij gebruikt .NET; van ADO is er dus al geen sprake . ;)

https://fgheysels.github.io/


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

whoami schreef op 12 augustus 2003 @ 15:57:
[...]


Hij gebruikt .NET; van ADO is er dus al geen sprake . ;)
ado.net dan. Zeikerd 8)


Journalism is printing what someone else does not want printed; everything else is public relations.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Rataplan schreef op 12 August 2003 @ 16:00:
[...]

ado.net dan. Zeikerd 8)
Uhm, in .NET spreek je gelijk welke DB aan via ADO.NET .
Bedoel je Sql Server aanspreken met de OleDb provider, dat dat problemen geeft?

Het zou me eerlijk gezegd verbazen....

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik gebruik MSAccess (2002) btw...

Maar ik ga het meteen ff proberen

  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

whoami schreef op 12 August 2003 @ 16:03:
Uhm, in .NET spreek je gelijk welke DB aan via ADO.NET .
Bedoel je Sql Server aanspreken met de OleDb provider, dat dat problemen geeft?

Het zou me eerlijk gezegd verbazen....
Wat ik in m'n hoofd had zitten is dat het tamelijk onhandig is om de SQLdataAdapter en de OleDBdataadapter door elkaar te gebruiken :D Trouwens best een ingrijpende designkeuze.

Maar ts gebruikt Access, dus OleDByada, dus niks aan de hand :)


Journalism is printing what someone else does not want printed; everything else is public relations.


Verwijderd

Topicstarter
Inderdaad...dit werkt perfect...hartstikke bedankt
Pagina: 1