Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

[c#]Strongly typed datatable

Pagina: 1
Acties:

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            DataTable table = new DataTable();

            table.Columns.Add("datetime", Type.GetType("System.DateTime"));
            table.Columns.Add("item", Type.GetType("System.String"));

            DateTime date = new DateTime(2000, 1, 1);
            // Create new DataRow objects and add to DataTable.    
            for (int i = 0; i < 10; i++)
            {
                DataRow row = table.NewRow();
                row["datetime"] = date.AddDays(i);
                row["item"] = "item " + i.ToString();
                table.Rows.Add(row);
            }

            DateTime date2 = table.Rows[3][0];


http://msdn.microsoft.com/en-us/library/kwfe1t7z(VS.85).aspx geeft aan dat de Item property altijd een object terug geeft. Daarom zal bovenstaand voorbeeld niet compilen aangezien er een cast mist op de laatste regel. Omdat het een strongly typed datatable is (regel 3 / 4), had ik verwacht dat de return type van het column type (DateTime in dit geval) zou zijn en geen object (waardoor bovenstaande gewoon zou werken).

Als ik regel 11 verander in row["datetime"] = i; compilet het programma ook niet met de volgende error. Volgens mij maakt dit duidelijk dat intern wel de waarde als DateTime wordt opgeslagen. Of is dit enkel een check voordat de waarde als object wordt opgeslagen?

Invalid cast from 'Int32' to 'DateTime'.Couldn't store <0> in datetime Column. Expected type is DateTime.opgeslagen?

Is er een manier om geen object terug te krijgen, maar het echte type van de column? Of zal ik telkens moeten casten?

  • beany
  • Registratie: Juni 2001
  • Laatst online: 16-11 14:01

beany

Meeheheheheh

Volgens mij moet je in deze situatie altijd typecasten. Je zou ook naar linq kunnen kijken, dat is wel strong-typed.

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
De this[index] property van de DataRow retourneerd een Object omdat deze property van elke column de waarde terug kan geven en de typen van deze columns verschillend kunnen zijn.

Die property retourneerd in principe wel een DateTime in jouw voorbeeld alleen wordt deze in de vorm van een object gegoten om de property universeel te maken (voor elk type). Gezien een object niet impliciet naar een DateTime gecast kan worden moet het expliciet (dmv (DateTime)table.Rows[3][0];).

Een optie is om een typed dataset aan te maken. Daarover staat genoeg op internet.

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Typed datasets zijn in feite dataset wrappers waarbij de properties 'automatisch' de typecasting regelen.

Wat je natuurlijk wel kun doen is gebruik maken van een generic list:
C#:
1
2
3
4
5
6
7
8
9
10
11
public class ItemEntity
{
    public DateTime Date { get; set; }
    public string Item { get; set; }
}

List<ItemEntity> table = new List<ItemEntity>();
table.Add(new ItemEntity { Date=DateTime.Now.AddDays(-2), Item="Hello" } );
table.Add(new ItemEntity { Date=DateTime.Now, Item="World" } );

DateTime date = table[1].Date;

Als je ook nog eens zoals Beany aangeeft Linq aan de mix toevoegt wordt het helemaal een dolle boel.

If it isn't broken, fix it until it is..


  • whoami
  • Registratie: December 2000
  • Laatst online: 13:47
In jouw codevoorbeeld zie ik helemaal geen strong typed datatable ...

Het is idd zo dat je, in het geval van een strong typed dataset die casts niet meer hoeft uit te voeren (strong typed), echter, jij hebt dus geen strong typed DS.

Jouw regel 3 & 4 hebben helemaal niets met strong typed datasets te maken. In regel 3 & 4 specifieer je gewoon dat je table 2 columns moet hebben met een bepaalde naam, en een bepaald type.
Als je een strong typed DataSet wil, zal je zelf je DataSet structuur mbhv een XSD moeten definiëren, en dan op basis van die XSD een class genereren. (met de XSD tool bv).
Maar, gelukkig heeft VS.NET daar ook tools voor (die dan wel weer die XSD tool gaan aanroepen)

[ Voor 106% gewijzigd door whoami op 08-07-2008 14:23 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Bedankt voor de antwoorden, het is duidelijk.
Pagina: 1