Toon posts:

[.NET] SqldataType opvragen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Waarschijnlijk heel simple, maar met Google en msdn niet kunnen vinden:

Ik probeer via de volgende code de DataType van de column te vinden, maar ik krijg een system.type terug (bijv System.String).
Hoe krijg ik de SQL type terug, dus varchar(30) bijv.


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
29
30
31
32
33
34
35
        private void cbDataBaseList_SelectedIndexChanged(object sender, System.EventArgs e)
        {
            lvColumnNames.Items.Clear();
            int i = 0;
            ComboBox temp = (ComboBox) sender;
            DataTable myDT = GetColumnNames(temp.Items[temp.SelectedIndex].ToString());
            foreach (DataColumn myDC in myDT.Columns)
            {
                lvColumnNames.Items.Add(myDC.ColumnName);
                lvColumnNames.Items[i].SubItems.Add(myDC.DataType.ToString());
                i++;
            }
        }

        private DataTable GetColumnNames(string myTable)
        {
            DataTable myDT = new DataTable();
            SqlConnection myConn = new SqlConnection(txtConnString.Text);
            SqlCommand mySQLC = new SqlCommand("SELECT * from " + myTable,myConn);
            SqlDataAdapter myDA = new SqlDataAdapter(mySQLC);
            
            try
            {
                myConn.Open();
                DataSet myDS = new DataSet();
                myDA.Fill(myDS, myTable);
                myDT = myDS.Tables[0];
            }
            catch (Exception e)
            {
                MessageBox.Show("Connection failed :\n" + e.Message);
            }

            return myDT;
        }


Thanx

[ Voor 28% gewijzigd door Verwijderd op 08-09-2004 17:24 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:52
MIsschien zo:

code:
1
myDC.DataType.Name


Het type van DataType is nl. Type. Vandaar dat je 'Type' terugkrijgt als je ToString() doet. Je krijgt het type terug van de variable die je aanspreekt, en DataType is dus van het type Type.

[ Voor 67% gewijzigd door whoami op 08-09-2004 17:26 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Nope, geeft zelfde als tostring() maar dan zonder System ervoor

  • EfBe
  • Registratie: Januari 2000
  • Niet online
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT  INFORMATION_SCHEMA.COLUMNS.*,  
(
    SELECT COLUMNPROPERTY(OBJECT_ID(@sFullTableName), INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, 'IsComputed')
) AS IsComputed, 
(
    SELECT COLUMNPROPERTY(OBJECT_ID(@sFullTableName), INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, 'IsIdentity')
) AS IsIdentity,
(
    SELECT COLUMNPROPERTY(OBJECT_ID(@sFullTableName), INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, 'IsRowGuidCol')
) AS IsRowGuidColumn,
(
    SELECT COLUMNPROPERTY(OBJECT_ID(@sFullTableName), INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, 'Precision')
) AS Length
FROM    INFORMATION_SCHEMA.COLUMNS 
WHERE   INFORMATION_SCHEMA.COLUMNS.TABLE_NAME=@sTableName 
        AND INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA='<schema>'
ORDER BY INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION ASC


waarbij @sFullTableName iets is als [schema].[tablename], @sTablename, dus gewoon de tablename en <schema> het schema, dus bv dbo.

Kijk in de help van INFORMATION_SCHEMA.COLUMNS (books online kijken) voor details omtrent de columns.

Een andere manier is een wat meer ranzige. Je gebuikt dan de SqlCommandBuilder om een insert query te maken :) Je zoekt dan in de parameters de column op waar je het type voor wilt hebben, en daarna kijk je naar de SqlDbType van de parameter voor het db type.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
OKee, ik gebruik de volgende SELECT om de info te krijgen, maar met de CHARACTER_MAXIMUM_LENGTH krijg ik dus voor de meeste DATA_TYPE NULL terug. |:(

code:
1
2
3
4
5
6
7
8
9
Select
COLUMN_NAME, 
DATA_TYPE, 
CHARACTER_MAXIMUM_LENGTH
From    
Test.Information_Schema.Columns

Where
Table_Name = 'TestTable'


Heb een perfect site gevonden waar alle info over Information_Schema staat maar ik kan dus niets vinden die voor alle DATA_TYPE soorten een INT terug geeft.

http://developer.mimer.co...cSet/Data_dic_views2.html

Welke moet ik hiervoor gebruiken.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Mja, CHARACTER_MAXIMUM_LENGTH is alleen van toepassing bij char en varchar fields (en ntext/text fields, maar die kun je beter op 2GB zetten).

Andere types hebben geen length. Je kunt de length eventueel wel ophalen:
SELECT COLUMNPROPERTY(OBJECT_ID(@sFullTableName), INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, 'Precision')
zie mijn query.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Okee, als ik dit door SQL query analyzer gooi krijg ik nogsteeds NULL als lenght :(

code:
1
2
3
4
SELECT COLUMNPROPERTY(OBJECT_ID('yafnet.dbo.yaf_Active'), INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, 'Precision')
 AS Length
FROM    yafnet.INFORMATION_SCHEMA.COLUMNS 
WHERE    Table_Name = 'yaf_Active'


(Heb gewoon maar een willekeurige table gepakt)

  • EfBe
  • Registratie: Januari 2000
  • Niet online
yafnet.INFORMATION_SCHEMA.COLUMNS, je gebruikt schema's ? anders is dit fout.

Wat krijg je nou als je die complete query gebruikt die ik postte. Die gebruik ik ook, en werkt perfect.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Alle lege velden:

Afbeeldingslocatie: http://www.lemonstudios.net/images/query.gif

[ Voor 4% gewijzigd door Verwijderd op 26-09-2004 15:50 ]


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Dat zijn geen lege velden, dat zijn gewoon helemaal geen resultaten.

| Toen / Nu


Verwijderd

:) Ook goed ......

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
In je WHERE statement gebruik je yaf_AccessMark terwijl in de rest van de query yat_AccessMark gebruikt is....

Oops! Google Chrome could not find www.rijks%20museum.nl


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 22-05 11:36
Als het MS-SQL betreft kan je natuurlijk ook
SQL:
1
sp_columns [tabelnaam]


gebruiken.

Verwijderd

P_de_B schreef op 14 september 2004 @ 08:55:
In je WHERE statement gebruik je yaf_AccessMark terwijl in de rest van de query yat_AccessMark gebruikt is....
hhmmmm, okee.
Had een error message verwacht .... :9

edit:

Okee, aangepast, maar nogsteeds hetzelfde ....

[ Voor 36% gewijzigd door Verwijderd op 14-09-2004 09:10 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Verwijderd schreef op 14 september 2004 @ 09:08:
[...]

hhmmmm, okee.
Had een error message verwacht .... :9

edit:
Okee, aangepast, maar nogsteeds hetzelfde ....
Je krijgt geen foutmelding als er geen records zijn die niet aan je criteria voldoen. Weet je zeker dat je het nu goed hebt aangepast? Niet per ongeluk de verkeerde verbetert? De query moet het verder gewoon doen namelijk.

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

hhmmmm, nou ik ga me er wel verder in verdiepen.
Als dit moet werken dan moet ik er op een gegeven moment wel uit komen, anders wordt dit een oneindige post met alleen maar veranderingen.

Thanx voor de info ppl ;)

  • EfBe
  • Registratie: Januari 2000
  • Niet online
In het allerergste geval kun je je nog storten op OleDbConnection.GetOleDbSchemaTable() en dan daarmee een datatable ophalen met schemainfo voor de table. Die query die ik je gegeven heb werkt echt :) Ik zal nog even kijken naar je query en hem even panklaar maken voor jouw schema

(edit) ik denk inderdaad wat P_de_B zegt, dat die naam fout is. Je krijgt geen foutmelding, want het is een stringetje dat je meegeeft aan die functie.

Wat wel raar is is dat je ook geen INFORMATION_SCHEMA.COLUMNS resultaten krijgt. Op zich zit die view niet zo bar moeilijk in elkaar. Als je SELECT * FROM INFORMATION_SCHEMA.COLUMNS doet, zie je al wat voor info je krijgt en waar je dus op moet filteren.

(kijk in books-online naar de formats van deze views)

[ Voor 47% gewijzigd door EfBe op 14-09-2004 09:36 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
Je kan in de screen van SQL query analyzer zien dat er naar de T=F fout (Die ik uiteraard wel heb verandert, verder naar mijn mening geen fouten meer zitten, maar ik kan me vergissen. Ik heb express geen copy past gedaan zodat je direct kan zien wat ik execute. Daarnaast staan de tabelen ernaast dus eigenlijk is alles wat je nodig hebt voor deze query te zien. ;)

Ik ben ondanks alles wel een hel stuk opgeschoten met mijn tooltje, dus dat zit verder wel okee. Ik krijg voor char,nvarchar en varchar wel gewoon mijn max_lengh terug en dat is toch alles wat ik op dit moment nodig had. :)

iig bedankt.

[ Voor 24% gewijzigd door Verwijderd op 14-09-2004 11:07 ]


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Aha, ik zie in dat screenshot dat je de master database hebt geselecteerd, daarin bestaat de tabel dbo.yaf_AccessMask niet. Als je de yafnet database selecteert krijg je denk ik wel resultaten.

| Toen / Nu


  • EfBe
  • Registratie: Januari 2000
  • Niet online
SuperRembo schreef op 14 september 2004 @ 11:11:
Aha, ik zie in dat screenshot dat je de master database hebt geselecteerd, daarin bestaat de tabel dbo.yaf_AccessMask niet. Als je de yafnet database selecteert krijg je denk ik wel resultaten.
inderdaad! :D. Dat had ik ff moeten vermelden, je moet wel de database selecteren waar je op wilt querien. Klinkt niet logisch, maar moet, want de views werken intern zo (erg ranzig allemaal, maar c'est la vie)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 22-05 11:36
EfBe schreef op 14 september 2004 @ 14:09:
[...]

inderdaad! :D. Dat had ik ff moeten vermelden, je moet wel de database selecteren waar je op wilt querien. Klinkt niet logisch, maar moet, want de views werken intern zo (erg ranzig allemaal, maar c'est la vie)
Nogmaals... waarom gebruik je niet de makkelijke oplossing voor MS-SQL?

[code=SQL]sp_columns [tabelnaam][/SQL]

Verwijderd

B) Hihi
idd de andere database geselecteerd en kreeg heel netjes alles terug.

Thanx all

PS: jvdmeer
jou 1 regel code geeft ook alles terug idd, maar krijgt iedere tabel deze stored Procedure ??

[ Voor 39% gewijzigd door Verwijderd op 14-09-2004 19:42 ]


  • EfBe
  • Registratie: Januari 2000
  • Niet online
jvdmeer schreef op 14 september 2004 @ 19:08:
[...]
Nogmaals... waarom gebruik je niet de makkelijke oplossing voor MS-SQL?
[code=SQL]sp_columns [tabelnaam][/SQL]
had ook gekund, alleen heb je dan niet alle info, die je wel uit de information_schema kunt trekken.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1