[ASP.NET C#] Datum en tijd in database zetten

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Thomas254
  • Registratie: Maart 2009
  • Laatst online: 15-09 11:31
ik wil in mijn webpagina data verzenden naar een database. Waaronder de huidige datum en tijd. Ik had daar de volgende SQL statement voor bedacht:


string vraag = "INSERT INTO tabl1 (id, Naam, Datum) VALUES (" + newid + ",' " + txt_name.Text + " ',' " + DateTime.Now.ToString() + " ')" ;

De database waarmee ik verbonden ben is een SQL database en het veld waarin ik de datetime probeer in te voeren is van het type datetime.

Als ik dit debug, krijg ik een foutmelding:

System.Data.SqlClient.SqlException: The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
The statement has been terminated.
bij System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
bij System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
bij System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
bij System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
bij System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async)
bij System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
bij System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
bij Guestbook_Sign.btn_send_Click(Object sender, EventArgs e) in c:\Users\Thomas\Documents\Visual Studio 2008\WebSites\website2\Default.aspx.cs:regel 57


Het rare is, dat het tot voor kort nog wel werkte, terwijl ik ( voor zover ik weet) niks aan de SQL statement verandert heb.

Als iemand een oplossing voor dit probleem heeft hoor ik het graag,

Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:59

TeeDee

CQB 241

Parameterized Queries en correcte datatypes. Je wil een DateTime opslaan, sla die dan ook op en geen String.
Het rare is, dat het tot voor kort nog wel werkte, terwijl ik ( voor zover ik weet) niks aan de SQL statement verandert heb.
Misschien je systeem instellingen of je lokalisatie aangepast.

Uiteraard is het ook wel de bedoeling dat je het e.e.a. zelf gedaan hebt. Nu is het een beetje van: "Dit is het, dat werkt niet, en help me nu maar uit de brand!"

C#:
1
string vraag = "INSERT INTO tabl1 (id, Naam, Datum) VALUES (" + newid + ",' " + txt_name.Text + " ',' " + DateTime.Now.ToString() + " ')" ;

Als ik dit trouwens ook zo zie: is je 'id' geen AutoIncrement? Geen verplichting natuurlijk... maar toch. En als laatste: er zal nu altijd voor de 'Naam' en 'Datum' en spatie staan. Dit komt door de spatie tussen ' en ".
Dabedoelik!

[ Voor 59% gewijzigd door TeeDee op 15-10-2009 00:29 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
De code die je nu hebt, is echt een 'accident waiting to happen'. Dit is fout op verschillende vlakken ....
Dit is kwetsbaar voor sql injection, datums sla je niet op als string, maar als date/datetime. (Men wil meestal wel eens wat met die datum gaan doen), etc...

pompdiedom

[quote]Als ik dit debug, krijg ik een foutmelding:

System.Data.SqlClient.SqlException: The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.[/[Die foutmelding krijg je ook als je je app runt .... Als je nu de foutmelding eens zo (begrijpend) lezen, en nadenken, dan weet je dat de fout ligt in het feit dat er een string is, die je aan je SQL statement meegeeft, en die niet naar een geldige datum kan omgezet worden.... Waar zou de fout dan liggen. :)
Ok, blijkbaar bewaar je datums dan toch niet in een varchar column, wat natuurlijk wel al goed is

[ Voor 104% gewijzigd door whoami op 15-10-2009 00:34 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
TeeDee schreef op donderdag 15 oktober 2009 @ 00:16:
Als ik dit trouwens ook zo zie: is je 'id' geen AutoIncrement? Geen verplichting natuurlijk... maar toch.
So ?
Waarom zou die id een auto-inc moeten zijn ? Het is nu een guid, en ik zie daar helemaal geen problemen mee ... (al is een auto-inc wel wat performanter, maar een auto-increment brengt ook andere nadelen met zich mee).

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:59

TeeDee

CQB 241

whoami schreef op donderdag 15 oktober 2009 @ 00:30:
[...]
So ?
Waarom zou die id een auto-inc moeten zijn ? Het is nu een guid, en ik zie daar helemaal geen problemen mee ... (al is een auto-inc wel wat performanter, maar een auto-increment brengt ook andere nadelen met zich mee).
Waar haal jij uit deze context vandaan dat het een Guid is? newid kan net zo hard een LastIDFromDB + 1 zijn. En als het een Guid (als in: Guid g = Guid.NewGuid oid) moeten er dan geen single quotes omheen staan?

[ Voor 10% gewijzigd door TeeDee op 15-10-2009 00:32 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
TeeDee schreef op donderdag 15 oktober 2009 @ 00:32:
[...]

Waar haal jij uit deze context vandaan dat het een Guid is? newid kan net zo hard een LastIDFromDB + 1 zijn. En als het een Guid (als in: Guid g = Guid.NewGuid oid) moeten er dan geen single quotes omheen staan?
newid() is de functie in SQL Server die je een nieuwe GUID retourneerd.

Ouch, ik ben verkeerd. :) In die zin dat dit newid in dit stukje code een variable is, en niet de SQL Server functie waar ik het eerder op had. My bad.

[ Voor 16% gewijzigd door whoami op 15-10-2009 00:35 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:59

TeeDee

CQB 241

whoami schreef op donderdag 15 oktober 2009 @ 00:34:
[...]

newid() is de functie in SQL Server die je een nieuwe GUID retourneerd.
Dat weet jij, dat weet ik, maar nu is newid een variable uit .Net.

edit:
:P

[ Voor 3% gewijzigd door TeeDee op 15-10-2009 00:36 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • Thomas254
  • Registratie: Maart 2009
  • Laatst online: 15-09 11:31
Dank je wel, ik had geen idee dat zoiets bestond _/-\o_ . Ik heb geleerd het met de quotes etc. te doen zonder parameters. Het werkt nu ook meteen :*) .
newid kan net zo hard een LastIDFromDB + 1 zijn
Ja dat klopt.

Dank u voor de hulp, ik kan weer verder :) .

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
Dat lijkt me nu eens een uitermate slecht idee .....
Wat als jij en ik tegelijkertijd een record gaan inserten ?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • keesdewit
  • Registratie: December 2003
  • Laatst online: 19-06 20:46
"INSERT INTO tabl1 (id, Naam, Datum) VALUES (" + newid + ", ' " + txt_name.Text + " ', GetDate())"

of je default value in mssql op GetDate() en de betreffende kolom op not nullable

Wel even je strings escapen en autonummering gebruiken op de id kolom.

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:59

TeeDee

CQB 241

keesdewit schreef op vrijdag 16 oktober 2009 @ 17:08:
"INSERT INTO tabl1 (id, Naam, Datum) VALUES (" + newid + ", ' " + txt_name.Text + " ', GetDate())"

of je default value in mssql op GetDate() en de betreffende kolom op not nullable

Wel even je strings escapen en autonummering gebruiken op de id kolom.
Ja, of gewoon parameterized queries gebruiken en niet moeilijk doen. Maar dat wordt al gelinked door whoami.

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • keesdewit
  • Registratie: December 2003
  • Laatst online: 19-06 20:46
[quote
Ja, of gewoon parameterized queries gebruiken en niet moeilijk doen. Maar dat wordt al gelinked door whoami.
[/quote]

Om het veilig te maken zonder escape gedoe is dat inderdaad de beste optie. Datum invoegen is meest efficient om de default value te gebruiken in mssql.

Acties:
  • 0 Henk 'm!

  • HeSitated
  • Registratie: April 2009
  • Laatst online: 03-12-2024
Thomas254 schreef op donderdag 15 oktober 2009 @ 11:52:
Ik heb geleerd het met de quotes etc. te doen zonder parameters.
|:(

Ik hoop voor jou dat je deze leermeester heel snel bedankt voor zijn bewezen diensten....
Het werkt nu ook meteen :*)
De vraag is alleen hoe lang (codepage dependency) en hoe veilig (SQL injection)....

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
HeSitated schreef op vrijdag 16 oktober 2009 @ 18:14:
[...]

|:(

Ik hoop voor jou dat je deze leermeester heel snel bedankt voor zijn bewezen diensten....


[...]

De vraag is alleen hoe lang (codepage dependency) en hoe veilig (SQL injection)....
Begrijpend lezen en selectief quoten is ook een vak ....

https://fgheysels.github.io/

Pagina: 1