[C#/SQL] Datatype databasekolom opvragen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • rickjehh
  • Registratie: Februari 2008
  • Laatst online: 25-09 14:56
Hallo mensen,

- Ik heb een MSSQL database waarvan de kolom datatypes geordend zijn via domains. Je kan in SQL een domain maken voor kolommen die allemaal hetzelfde datatype zijn. Dus als je b.v. 10 kolommen hebt die allemaal varchar(50) zijn, dan kan je daar een domain voor maken zodat als je het datatype wil wijzigen, je alleen het domain maar van datatype hoeft te veranderen. Dat scheelt een hoop werk.
- M.b.v. de referemce Microsoft.SqlServer.Management.Smo haal ik een lijst op met de tabellen van de database.
- Ik heb me een tijd suf zitten debuggen via de watch om uit te zoeken welke properties de variabele type allemaal meekrijgt op het moment dat hij gevuld wordt met co.DataType. Ik zie echter geen property waarbij gewoon het datatype staat.

Nu zit ik met het volgende probleem: Ik wil van elke kolom in een tabel de datatypes ophalen. Normaal gesproken zou dit prima gaan met het volgende stukje code:

C#:
1
2
3
4
foreach (Column co in tabel.Columns)
{
    DataType type = co.Datatype;
}


edit:

Foutje in mijn code aangepast na opmerking van RobIII over de property. Het moet gewoon co.DataType zijn. Opmerkingen over debuggen toegevoegd.

Als ik dit doe krijg ik echter alleen maar de domain naam en niet het datatype van dat domain. Weet iemand hoe ik het datatype van het betreffende domain kan krijgen?

[ Voor 36% gewijzigd door rickjehh op 17-11-2008 17:08 ]


Acties:
  • 0 Henk 'm!

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

Niemand_Anders

Dat was ik niet..

Probeer eens '.Name' weg te laten aangezien ik er vanuit ga dat co.Datatype al van het type DataType is. Plaats anders eens een breakpoint op de regel en kijk eens via de quick watch wat voor properties 'co' en 'co.Datatype' terug geeft.

Ofwel probeer eens wat zelf. Als het niet mocht werken vergaat echt de wereld niet..

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


Acties:
  • 0 Henk 'm!

  • rickjehh
  • Registratie: Februari 2008
  • Laatst online: 25-09 14:56
Niemand_Anders schreef op maandag 17 november 2008 @ 15:59:
Probeer eens '.Name' weg te laten aangezien ik er vanuit ga dat co.Datatype al van het type DataType is. Plaats anders eens een breakpoint op de regel en kijk eens via de quick watch wat voor properties 'co' en 'co.Datatype' terug geeft.

Ofwel probeer eens wat zelf. Als het niet mocht werken vergaat echt de wereld niet..
Denk je dat ik zelf nog niets heb geprobeerd? Dat is nou juist de reden dat ik dit vraag, je doet net alsof ik niet weet wat de debugger is en ik nog nooit gehoord heb van de watch. Ik vraag het omdat ik er zelf niet uit kom, dat is nou juist het punt.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
rickjehh schreef op maandag 17 november 2008 @ 16:02:
[...]


Denk je dat ik zelf nog niets heb geprobeerd? Dat is nou juist de reden dat ik dit vraag, je doet net alsof ik niet weet wat de debugger is en ik nog nooit gehoord heb van de watch. Ik vraag het omdat ik er zelf niet uit kom, dat is nou juist het punt.
Kalmeer even. Je vermeld niet in je topicstart dat je al hebt zitten debuggen of gebruik hebt gemaakt van de debugger; dan is het helemaal niet gek dat er naar gevraagd wordt. Zoals je in onze Quickstart (met name punt 4 t/m 7) kunt lezen verwachten we dat je die info allemaal in je topicstart vermeldt, anders krijg je dus inderdaad die opmerkingen eerst. En je zou de eerste niet zijn die z'n vraag zonder verdere moeite dumpt waarna wij na 3 uur raden waar het probleem zit achter moeten komen dat hij/zij niet weet hoe hij/zij moet debuggen.

Verder vind ik het stug dat je een .Name (typisch toch wel een string) property aan een DataType variabele kunt assignen...

[ Voor 16% gewijzigd door RobIII op 17-11-2008 16:24 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • rickjehh
  • Registratie: Februari 2008
  • Laatst online: 25-09 14:56
RobIII schreef op maandag 17 november 2008 @ 16:17:
[...]

Kalmeer even. Je vermeld niet in je topicstart dat je al hebt zitten debuggen of gebruik hebt gemaakt van de debugger; dan is het helemaal niet gek dat er naar gevraagd wordt. Zoals je in onze Quickstart (met name punt 4 t/m 7) kunt lezen verwachten we dat je die info allemaal in je topicstart vermeldt, anders krijg je dus inderdaad die opmerkingen eerst. En je zou de eerste niet zijn die z'n vraag zonder verdere moeite dumpt waarna wij na 3 uur raden waar het probleem zit achter moeten komen dat hij/zij niet weet hoe hij/zij moet debuggen.

Verder vind ik het stug dat je een .Name (typisch toch wel een string) property aan een DataType variabele kunt assignen...
Je hebt gelijk, foutje in mijn code getypt op de 1 of andere manier. het moet gewoon co.DataType zijn. Is mijn topicstart nu wat duidelijker?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
rickjehh schreef op maandag 17 november 2008 @ 16:26:
Je hebt gelijk, foutje in mijn code getypt op de 1 of andere manier. het moet gewoon co.DataType zijn. Is mijn topicstart nu wat duidelijker?
Nou... :P
rickjehh schreef op maandag 17 november 2008 @ 15:45:
Als ik dit doe krijg ik echter alleen maar de domain naam en niet het datatype van dat domain. Weet iemand hoe ik het datatype van het betreffende domain kan krijgen?
Wat ik nog verwarrend vind is dat je het hebt over kolommen (je SQL fields zeg maar) en dan opeens over een domain. Ik neem aan dat je gewoon een kolom "domain" hebt (die dus bijv. 'string' zou moeten geven) en een andere kolom 'foo' (die bijv. 'int' zou moeten geven)? Je krijgt dus de values van de fields en niet de types? Begrijp ik dat goed?

DataType zou toch echt het type terug moeten geven...
Lethalis schreef op maandag 17 november 2008 @ 16:34:
select * from information_schema.columns
Hij gebruikt SMO ;)

[ Voor 61% gewijzigd door RobIII op 17-11-2008 16:36 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Wat wil je precies?

Het datatype in de database, of een mapping?

Voor wat t-sql:

select * from information_schema.columns

Uit te voeren in de context van jouw database ;)

[ Voor 15% gewijzigd door Lethalis op 17-11-2008 16:36 ]

Ask yourself if you are happy and then you cease to be.


Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Ja, is allemaal leuk en aardig.. maar je kunt jezelf afvragen of dat nodig is.

Als ik een lijst met tabellen en datatypes van een database in een c# applicatie wil krijgen, dan voer ik gewoon een query op het information_schema uit en heb ik meteen alle informatie die ik nodig heb. Werkt altijd :)

Ask yourself if you are happy and then you cease to be.


Acties:
  • 0 Henk 'm!

  • rickjehh
  • Registratie: Februari 2008
  • Laatst online: 25-09 14:56
Wat ik nog verwarrend vind is dat je het hebt over kolommen (je SQL fields zeg maar) en dan opeens over een domain. Ik neem aan dat je gewoon een kolom "domain" hebt (die dus bijv. 'string' zou moeten geven) en een andere kolom 'foo' (die bijv. 'int' zou moeten geven)? Je krijgt dus de values van de fields en niet de types? Begrijp ik dat goed?
Ik heb mijn topicstart weer aangepast met uitleg over domains. Je kan in SQL server domains aanmaken voor het geval je meerdere kolommen hebt met hetzelfde datatype. Op die manier hoef je maar op 1 plek het datatype aan te geven waardoor alle kolomen die van dat domain zijn het gedefinieerde datatype krijgen.

@Lethalis

Ik gebruik idd SMO omdat ik eerst een lijst met beschikbare servers ophaal in een lijst, daarna de beschikbare databases van de geselecteerde server in een lijst weergeef en ook een lijst met beschikbare tabellen van de geselecteerde database weergeef.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
rickjehh schreef op maandag 17 november 2008 @ 17:11:
Ik heb mijn topicstart weer aangepast met uitleg over domains. Je kan in SQL server domains aanmaken voor het geval je meerdere kolommen hebt met hetzelfde datatype. Op die manier hoef je maar op 1 plek het datatype aan te geven waardoor alle kolomen die van dat domain zijn het gedefinieerde datatype krijgen.
Ah kijk; dat verduidelijkt de zaak ;) Zie je nu waarom je die topicstart zo uitgebreid mogelijk moet houden? ;)
Als je een domain terugkrijgt (wat logisch is in deze) zou je dus daarna de datatype van de domain moeten ophalen en niet van de column. Lijkt me dan ;)

Dan is het een kwestie van even googlen denk ik.

[ Voor 8% gewijzigd door RobIII op 17-11-2008 17:29 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • rickjehh
  • Registratie: Februari 2008
  • Laatst online: 25-09 14:56
Problem solved. Eerst moet je van de betreffende tabel de database opvragen. Waarna je alle UserDefinedDataTypes kan opvragen, hiervan kan je dan weer het systemtype opvragen waarna je het datatype hebt. De code is als volgt:

C#:
1
2
3
4
5
6
7
8
Database db = table.Parent;
foreach (Column co in tb.Columns)
{
    if (db.UserDefinedDataTypes.Contains(co.DataType.ToString()))
    {
        type = db.UserDefinedDataTypes[co.DataType.ToString()].SystemType;
    }
}


Iedereen bedankt voor de reacties.

[ Voor 4% gewijzigd door rickjehh op 18-11-2008 09:04 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Zijn die .ToString() calls nodig? Ik heb even geen documentatie bij de hand, maar kun je niet meteen het type doorgeven?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • rickjehh
  • Registratie: Februari 2008
  • Laatst online: 25-09 14:56
RobIII schreef op dinsdag 18 november 2008 @ 09:19:
Zijn die .ToString() calls nodig? Ik heb even geen documentatie bij de hand, maar kun je niet meteen het type doorgeven?
jes die zijn nodig. De method Contains() verwacht een string als input en ook db.UserDefinedDataTypes[] verwacht een int of string als input :)

[ Voor 10% gewijzigd door rickjehh op 18-11-2008 15:22 ]

Pagina: 1