[ASP.NET] .ToShortDateString() werkt niet in C#, wel in VB?

Pagina: 1
Acties:

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 00:54

Pelle

🚴‍♂️

Topicstarter
Hier snap ik dus echt geen pepernoot van. Ik wil m'n ASP.NET dingen het liefst in C# schrijven.
Ik trek wat dingen uit een database en stop die in wat <asp:label>'s.

Zie hier een stukje C# sourcecode:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["conn_tdtest_local"]);
SqlCommand    comm = new SqlCommand("tdplanning_show_servicecall", conn);
comm.CommandType   = CommandType.StoredProcedure;

conn.Open();
SqlDataReader result = comm.ExecuteReader();
result.Read();

servicedatum.Text = result["Call ingepland"].ToShortDateString();
richttijd.Text    = result["Call ingepland"].ToShortTimeString();

result.Close();
conn.Close();


Het veld Call ingepland is een DateTime veld. Maar toch krijg ik deze error op regel 9:
Compilatiefout
Beschrijving: Er is een fout opgetreden bij het compileren van een bron die vereist is om aan deze aanvraag te voldoen. Controleer de volgende details van deze fout en pas waar nodig de broncode aan.

Foutbericht van compiler: CS0117: 'object' does not contain a definition for 'ToShortDateString'
Ook als ik expliciet cast naar een DateTime class dan werkt het niet:

C#:
1
servicedatum.Text   = (DateTime) result["Call ingepland"].ToShortDateString(); 


Omdat ik iets dergelijks in VbScript al wel eens voor elkaar had gekregen, heb ik het stukje even herschreven:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Dim conn   As SqlConnection
Dim comm   As SqlCommand
Dim result As SqlDataReader

conn             = new SqlConnection(ConfigurationSettings.AppSettings("conn_tdtest_local"))
comm             = new SqlCommand("tdplanning_show_servicecall", conn)
comm.CommandType = CommandType.StoredProcedure

conn.Open()
result = comm.ExecuteReader()
result.Read()

servicedatum.Text = result.Item("Call ingepland").ToShortDateString()
richttijd.Text    = result.Item("Call ingepland").ToShortTimeString()

result.Close()
conn.Close()


En dit gaat dus wél goed 8)7
Als output krijg ik heel netjes '23-9-2005' en '10:30'.

Wie kan mij vertellen wat ik fout doe?

[ Voor 4% gewijzigd door Pelle op 23-09-2005 11:00 ]


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 11:13

pjvandesande

GC.Collect(head);

C#:
1
2
3
4
5
servicedatum.Text   = ((DateTime)result["Call ingepland"]).ToShortDateString(); 

// Of

richttijd.Text      = (result["Call ingepland"] as DateTime).ToShortTimeString(); 

Verwijderd

Volgens mij moet je het met Convert doen... Zie hier en hier.

Op de 1e link staat het volgende :
Use the Convert class for conversions instead of this type's explicit interface member implementation of IConvertible.

  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 01-04 20:36

Not Pingu

Dumbass ex machina

VB voert automatisch impliciete casts uit, C# doet dat niet.

Certified smart block developer op de agile darkchain stack. PM voor info.


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 11:13

pjvandesande

GC.Collect(head);

Verwijderd schreef op vrijdag 23 september 2005 @ 11:02:
Volgens mij moet je het met Convert doen
Convert is een beetje overkill er hoeft namelijk alleen gecast te worden.

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:12
questa schreef op vrijdag 23 september 2005 @ 11:16:
[...]


Convert is een beetje overkill er hoeft namelijk alleen gecast te worden.
Convert is volgens mij minder duur dan een cast.

(Een cast gaat gaan boxen/unboxen, ik weet niet wat Convert under the hood doet).

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 11:13

pjvandesande

GC.Collect(head);

whoami schreef op vrijdag 23 september 2005 @ 11:18:
[...]


Convert is volgens mij minder duur dan een cast.

(Een cast gaat gaan boxen/unboxen, ik weet niet wat Convert under the hood doet).
Hangt een beetje van het type af. Als je bijvoorbeeld een string type covert naar een DateTime zal DateTime.Parse worden gebruikt. Is het een object dan zal IConvertAble.ToDateTime worden gebruikt, wat die dan weer doet is natuurlijk afhankelijk van de implementatie.

Een simpelen test die geeft misschien meer duidelijkheid:

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
class Class1
{
   [STAThread]
   static void Main(string[] args)
   {
      int IntValue = 23;
      object IntReference = IntValue;
   
      int Test1;
      int Test2;
   
      DateTime Start1 = DateTime.Now;
      for( int i = 0; i < 100000000; i++ )
         Test1 = Convert.ToInt32( IntReference );
      DateTime End1 = DateTime.Now;
   
      DateTime Start2 = DateTime.Now;
      for( int i = 0; i < 100000000; i++ )
         Test2 = (int) IntReference;
      DateTime End2 = DateTime.Now;
   
      TimeSpan Span1 = new TimeSpan( End1.Ticks - Start1.Ticks );
      TimeSpan Span2 = new TimeSpan( End2.Ticks - Start2.Ticks );
   
      Console.WriteLine( "Test 1 : " + Span1.TotalMilliseconds );
      Console.WriteLine( "Test 2 : " + Span2.TotalMilliseconds );
   }
}


Wat resulteerd in:
Test 1: 2218
Test 2: 546
Converteren is natuurlijk ook wel logies dat dat duurder is, je wilt namelijk iets converteren dus van een object een ander object maken, dus bijvoorbeeld een string naar een int, iets wat je bij casten niet doet.

[ Voor 9% gewijzigd door pjvandesande op 23-09-2005 11:30 ]


  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 00:54

Pelle

🚴‍♂️

Topicstarter
questa schreef op vrijdag 23 september 2005 @ 11:00:
C#:
1
servicedatum.Text   = ((DateTime)result["Call ingepland"]).ToShortDateString(); 
Hmm, op zich had ik dat zelf kunnen bedenken, dat ik alleen result["Call ingepland"] had moeten casten. 8)7 Maar toch raar dat een DateTime-veld uit SQL in C# eerst expliciet gecast of geconvert moet worden naar DateTime voor je er iets mee kunt.
Zit daar een bepaalde filosofie achter?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 27-04 18:17

gorgi_19

Kruimeltjes zijn weer op :9

Omdat in VB.Net Option Strict uit staat, normaliter, hoewel ze wel aanraden om die wel aan te zetten :P

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 14:12
De manier waarop jij gegevens uitleest uit je datareader returned objects.

Als je 't al direct als het goede type wilt uitlezen, dan gebruik je de GetDAteTime method v/d reader. Dan moet je echter wel de index meegeven, ipv de naam.

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 11:13

pjvandesande

GC.Collect(head);

Pelle schreef op vrijdag 23 september 2005 @ 11:38:
[...]


Hmm, op zich had ik dat zelf kunnen bedenken, dat ik alleen result["Call ingepland"] had moeten casten. 8)7 Maar toch raar dat een DateTime-veld uit SQL in C# eerst expliciet gecast of geconvert moet worden naar DateTime voor je er iets mee kunt.
Zit daar een bepaalde filosofie achter?
Omdat je IDataReader object alles als een object ziet. Opzich ook wel logies, want de DataReader weet natuurlijk niet wat voor object het is.

Je zou wel gebruik kunnen maken van Typed Datasets, alleen dat is weer een heel ander verhaal.

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:12
Typed Datasets.... the mr Hyde implementation of the evil dataset.

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 11:13

pjvandesande

GC.Collect(head);

whoami schreef op vrijdag 23 september 2005 @ 11:49:
Typed Datasets.... the mr Hyde implementation of the evil dataset.
offtopic:
Dat vind ik een mooie discussie, de meningen zijn daar heel erg over verdeelt.
Pagina: 1