[ASP.NET] Datum niet toegestaan (cdate)

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

  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:29

Rhapsody

In Metal We Trust

Topicstarter
Hey,

als ik via een webform een record wil toevoegen aan mun SQL 2k Database dan krijg ik een melding dat de datum van een bepaald veld (aankoopdatum) niet goed is.

"System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM"


Dit omdat het veld dus leeg is. Het veld is namelijk ook niet verplicht om in te vullen.

Hoe zorg ik ervoor dat als het veld niet ingevuld word de rest toch word toegevoegd, en er dus geen fout optreedt qua typeconversie.

🇪🇺 pro Europa!


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:40
Ik weet niet of dit de oplossing zal zijn (niet getest), maar een SqlParameter object heeft een property IsNullable. Als je die op true zet, kan je dan waarschijnlijk 'null' doorgeven als parameter value.

code:
1
2
cmdCommand.Parameters["@param1"].IsNullable = true;
cmdCommand.Parameters["@param1"].Value = null;

oid.

[ Voor 24% gewijzigd door whoami op 07-01-2003 19:51 ]

https://fgheysels.github.io/


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:29

Rhapsody

In Metal We Trust

Topicstarter
ehm,

waar moet ik dat neer zetten??

Ik gebruik die webmatrix voor de SQL codes.

hieronder staat een stukje code wat ik gebruik:

dim strDate as date
strDate = cdate(txtDatumAankoop.text)
Addrecord(.................................., strDate,...........)

en dit is dan de fout die ik krijg als ik txtDatumAankoop leeg laat:


System.InvalidCastException: Cast from string "" to type 'Date' is not valid

🇪🇺 pro Europa!


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21:12

gorgi_19

Kruimeltjes zijn weer op :9

als txtDatumAankoop.text een ongeldige datum is, kan deze niet gecast worden als datum en komt deze exception dus te voorschijn.
Je moet van te voren controleren of het een geldige datum is en zo ja, dan pas updaten. Eventueel is een 'ranzigere' methode mogelijk door middel van ene try-catch-finally stratement.

Een lege tekstbox is niet null / nothing, maar een lege string.

[ Voor 18% gewijzigd door gorgi_19 op 07-01-2003 20:03 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:40
Hmm... Ik weet niet hoe jij een record add in uw databank...

Doe je dit dmv een SQL statement (INSERT)?

Ik doe het altijd zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
SqlConnection conn = new SqlConnection ( "connectionstring");
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "INSERT INTO tabel (veld1, veld2) VALUES (@param1, @param2)";

cmd.Parameters.Add ("@param1", SqlDbType.VarChar);
cmd.Parameters.Add("@param2", SqlDbType.DateTime);

cmd.Parameters["@param1"].Value = "test";
cmd.Parameters["@param2"].IsNullable = true;
cmd.Parameters["@param2"].Value = null;

cmd.ExecuteNonQuery();

https://fgheysels.github.io/


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:29

Rhapsody

In Metal We Trust

Topicstarter
er word gecontroleerd dmv reg.exp. of het een geldige datum is, maar hij geeft deze fout enkel als het textveld leeg is.

En het moet mogelijk zijn om het veld te laten, omdat het geen veplicht veld is.

edit:

Ik heb ook ongeveer dezelfde manier, alleen heb ik het in een functie geplant en dan geef ik de waarden mee

[ Voor 24% gewijzigd door Rhapsody op 07-01-2003 20:08 ]

🇪🇺 pro Europa!


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21:12

gorgi_19

Kruimeltjes zijn weer op :9

Rhapsody schreef op 07 January 2003 @ 20:03:
er word gecontroleerd dmv reg.exp. of het een geldige datum is, maar hij geeft deze fout enkel als het textveld leeg is.

En het moet mogelijk zijn om het veld te laten, omdat het geen veplicht veld is.
Controleren in je code:
Als het veld leeg is, dan voer je :system.DBNull.Value in, anders voer je de datum in.
edit:

Disclaimer: Ik ben VB.Net gewend, welke NIET case-sensitive is, dus dat mag je zelf uitzoeken.. :+

[ Voor 13% gewijzigd door gorgi_19 op 07-01-2003 20:08 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:29

Rhapsody

In Metal We Trust

Topicstarter
heb nu deze code:

code:
1
2
3
4
5
6
7
8
if txtDatumAankoop.text <> "" then
   dim temp() as string
   strDate = cdate(txtDatumAankoop.text)
   txtDatumAankoop.text = strdate
   AddRecord(ucase(txtOrdernr.text), ucase(ddlMerk.selecteditem.text),txtDatumAankoop.text)
else
   AddRecord(ucase(txtOrdernr.text), ucase(ddlMerk.selecteditem.text), system.DBNull.Value)
end if


als fout krijg ik dan:
BC30311: Value of type 'System.DBNull' cannot be converted to 'Date'.

maw ik doe iets heel ergs stoms fout ;)

🇪🇺 pro Europa!


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21:12

gorgi_19

Kruimeltjes zijn weer op :9

[gokmodus]
Of wiebenik :+ heeft gelijk en moet je daar gewoon Nothing invullen...
[/gokmodus]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:29

Rhapsody

In Metal We Trust

Topicstarter
dan krijg ik deze fout:

Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

🇪🇺 pro Europa!


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:40
En als je gewoon die IsNullable op true zet, en geen value aan die parameter toekent?

https://fgheysels.github.io/


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:29

Rhapsody

In Metal We Trust

Topicstarter
IsNullable staat op true,
Maar dan krijg ik nog steeds een fout, dat de datum niet goed is.
Hij zegt dan dat ie het niet kan converteren van een string naar date format.
Ookal is het veld leeg.

Dit is de functie:

code:
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
    Function AddRecord( _
                ByVal ordernummer As String,  _
                ByVal merk As String,  _
                ByVal aankoopdatum As Date) As Integer
        Dim connectionString As String = "server='localhost'; user id='E-care'; password='E-care'; Database='E-care'"
        Dim sqlConnection As System.Data.SqlClient.SqlConnection = New System.Data.SqlClient.SqlConnection(connectionString)
    
        Dim queryString As String = "INSERT INTO [E-care].[Product] ([Ordernummer], [Merk], [Aankoopdatum) VALUES (@Ordernummer, @Merk, @Aankoopdatum)"
        Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
    
        sqlCommand.Parameters.Add("@Ordernummer", System.Data.SqlDbType.NVarChar).Value = ordernummer
        sqlCommand.Parameters.Add("@Merk", System.Data.SqlDbType.NVarChar).Value = merk
          sqlCommand.Parameters.Add("@Aankoopdatum", System.Data.SqlDbType.SmallDateTime).Value = aankoopdatum
    

        Dim rowsAffected As Integer = 0
        sqlConnection.Open
        Try
            rowsAffected = sqlCommand.ExecuteNonQuery
        Finally
            sqlConnection.Close
        End Try
    
        Return rowsAffected
    End Function



en zo roep ik die functie aan:

code:
1
2
strDate = nothing
AddRecord(ucase(txtOrdernr.text), ucase(ddlMerk.selecteditem.text),strDate)


of als de aankoopdatum wel ingevuld is:

code:
1
2
strDate = cdate(txtDatumAankoop.text)
AddRecord(ucase(txtOrdernr.text), ucase(ddlMerk.selecteditem.text), strDate)

[ Voor 81% gewijzigd door Rhapsody op 07-01-2003 20:41 ]

🇪🇺 pro Europa!


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21:12

gorgi_19

Kruimeltjes zijn weer op :9

[ranzige opmerkingmodus]
Zet je datum, indien deze niet geldig is, op 1900
[/ranzige opmerkingmodus]
En als een veld leeg is, is deze niet nothing / null

[ Voor 21% gewijzigd door gorgi_19 op 07-01-2003 20:39 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:29

Rhapsody

In Metal We Trust

Topicstarter
tja dat kan ook ja, heb ik ook al wel over nagedacht maar dat is niet zo netjes :(

🇪🇺 pro Europa!


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:40
En met die DBNull.Value ?
code:
1
2
cmd.Parameters["@p].IsNullable = true;
cmd.Parameters["@p"].Value = DBNull.Value;

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21:12

gorgi_19

Kruimeltjes zijn weer op :9

Vandaar ook: ranzige opmerkingmodus.. :+

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:40
gorgi_19 schreef op 07 January 2003 @ 20:38:
[ranzige opmerkingmodus]
Zet je datum, indien deze niet geldig is, op 1900
[/ranzige opmerkingmodus]
En als een veld leeg is, is deze niet nothing / null


Nou, dat is prutsen... :+

https://fgheysels.github.io/


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:29

Rhapsody

In Metal We Trust

Topicstarter
Als ik DbNull.value gebruik krijg ik dit:

Value of type 'System.DBNull' cannot be converted to 'Date'

en als ik die parameters gebruik:

Property access must assign to the property or use its value

[ Voor 40% gewijzigd door Rhapsody op 07-01-2003 20:47 ]

🇪🇺 pro Europa!


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21:12

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 07 January 2003 @ 20:43:

[...]


Nou, dat is prutsen... :+
offtopic:
Noem je dit prutsen? Ik kan ergere code laten zien van me.. :X

[ontopic]
Per definitie mag pas je DBNul.Value trouwens pas in je SQL statement ingevoerd worden en niet gecast worden naar een datum.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:29

Rhapsody

In Metal We Trust

Topicstarter
k die heb ik er weer uitgehaald, en heb die parameters geprobeerd:

Property access must assign to the property or use its value

code:
1
2
sqlCommand.Parameters["@Aankoopdatum"].IsNullable = true
sqlCommand.Parameters["@Aankoopdatum"].Value = DBNull.Value

🇪🇺 pro Europa!


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:40
Woei!
Found it denk ik....

In de .NET SDK:
Data intensive applications accessing SQL databases must use the System.Data.SqlTypes classes, which have inherent support for null values.
Dus:
Zet die IsNullable op true, en zet als value:
code:
1
SqlDateTime.Null

(Als je SqlDateTime als veldtype gespecifeerd hebt natuurlijk).

https://fgheysels.github.io/


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:29

Rhapsody

In Metal We Trust

Topicstarter
heb deze 2 regels eronder gezet:

sqlCommand.Parameters["@Aankoopdatum"].IsNullable = true
sqlCommand.Parameters["@Aankoopdatum"].Value = SqlDateTime.Null

en dan is dit die fout: (komt door de eerste regel met IsNullable)

BC30545: Property access must assign to the property or use its value.

🇪🇺 pro Europa!


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21:12

gorgi_19

Kruimeltjes zijn weer op :9

Op het eerste gezicht lijkt het er op alsof je C# en VB.Net nu gaat mixen (whoami kan alleen maar C# :P). Volgens mij moet je [ vervangen door (; zal het ff nakijken..

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:29

Rhapsody

In Metal We Trust

Topicstarter
ow , ik had nl al de ; weggehaald.

heb geprobeerd met ( en ) maar dan krijg ik de fout op de 2de regel:

BC30451: Name 'SqlDateTime' is not declared.

🇪🇺 pro Europa!


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21:12

gorgi_19

Kruimeltjes zijn weer op :9

Mis je dan niet een namespace?
edit:

Ja, je moet System.Data.SqlTypes importen

[ Voor 50% gewijzigd door gorgi_19 op 07-01-2003 20:56 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:40
code:
1
using System.Data.SqlTypes

in C# code that is...

Ff de help die bij het framework zit erbij pakken....

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21:12

gorgi_19

Kruimeltjes zijn weer op :9

whoami: hoort daar geen ; achter? O-)
Visual Basic .NET:
1
imports System.Data.SqlTypes

[ Voor 3% gewijzigd door gorgi_19 op 07-01-2003 21:03 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:40
[nohtml]
gorgi_19 schreef op 07 januari 2003 @ 20:58:
whoami: hoort daar geen ; achter?
Euh, ja.

https://fgheysels.github.io/


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:29

Rhapsody

In Metal We Trust

Topicstarter
Mag ik jullie allen bedanken, ik heb het voor elkaar:

Heb 2 functies, 1 met en 1 zonder ingevulde datum dmv die SQLDateTime.Null

Het had vast wel mooier gekund, maar ik ben er zo heel blij mij.

Ontzettend bedankt!!

🇪🇺 pro Europa!


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:40
Rhapsody schreef op 07 januari 2003 @ 21:05:
Mag ik jullie allen bedanken, ik heb het voor elkaar:

Heb 2 functies, 1 met en 1 zonder ingevulde datum dmv die SQLDateTime.Null

Het had vast wel mooier gekund, maar ik ben er zo heel blij mij.

Ontzettend bedankt!!


Hoezo mooier?
Die SqlDateTime.Null zal wel de enige mooie manier zijn om dat op te lossen.

(Tenzij je doelt op jouw oplossing met 2 functies). :+

https://fgheysels.github.io/


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:29

Rhapsody

In Metal We Trust

Topicstarter
ja ik bedoel mijn 2 functies ;)

[ Voor 7% gewijzigd door Rhapsody op 07-01-2003 21:23 . Reden: typefoutje ]

🇪🇺 pro Europa!


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:40
Rhapsody schreef op 07 januari 2003 @ 21:22:
ja ik bedoel mijn 2 functies ;)


Kun je niet één functie maken, en in die functie nagaan of die datum moet ingevuld zijn of niet?
Desnoods met een of andere boolean variable.

https://fgheysels.github.io/


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:29

Rhapsody

In Metal We Trust

Topicstarter
zou wel kunnen, maar voorlopig laat ik hem eventjes zo, misschien dat ik het straks nog even ga proberen.

🇪🇺 pro Europa!

Pagina: 1