2014-06-11 20 views
7

C'è un modo per conoscere il tipo esatto di una colonna in un DataTable? In questo momento sto facendo questo:Come ottenere il tipo esatto di colonne numeriche incl. scala e precisione?

DataTable st = dataReader.GetSchemaTable(); 
foreach (DataColumn col in st.Columns) 
{ 
    var type = col.DataType; 
} 

Ora con type.Name sono in grado di trovare se si tratta di un numero (o intdecimal ..) oppure string ma il problema è che ho bisogno l'esatto tipo, ad esempio se nel database diciamo che la colonna Rate è NUMBER(4,3) quindi qui nel mio codice sto ricevendo solo il tipo "Decimale" e nessuna informazione sul formato 4,3.

Ora il requisito è che ho bisogno di formattare i valori secondo il loro tipo per es. se Rate=1.4 deve essere visualizzato come 0001.400 (in base al formato). Quindi, poiché non ho informazioni, non sono in grado di elaborare ulteriormente i valori. C'è comunque da sapere lo stesso?

Grazie

+0

http://msdn.microsoft.com/en-IN/library/system.data.datacolumn.datatype.aspx – Bharadwaj

+0

ciclo throught ogni riga alias DataRow e l'utilizzo reflection getType of individual .. –

+0

È necessario esaminare gli attributi aggiuntivi sulla colonna per determinarlo con precisione. Ad esempio, consulta le proprietà NumericPrecision e NumericScale http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getschematable%28v=vs.110%29.aspx – dmarietta

risposta

5

È possibile utilizzare NumericPrecision e NumericScale:

using (var con = new SqlConnection(Properties.Settings.Default.RM2ConnectionString)) 
using (var cmd = new SqlCommand("SELECT * FROM dbo.Test", con)) 
{ 
    con.Open(); 
    using (var reader = cmd.ExecuteReader()) 
    using (var schemaTable = reader.GetSchemaTable()) 
    { 
     foreach (DataRow row in schemaTable.Rows) 
     { 
      string column = row.Field<string>("ColumnName"); 
      string type = row.Field<string>("DataTypeName"); 
      short precision = row.Field<short>("NumericPrecision"); 
      short scale = row.Field<short>("NumericScale"); 
      Console.WriteLine("Column: {0} Type: {1} Precision: {2} Scale: {3}", column, type, precision, scale); 
     } 
    } 
} 

Maggiori informazioni: GetSchemaTable

ho testato con un tavolo fresco con una singola colonna NumberColumn di tipo numeric(4, 3):

Column: NumberColumn Type: decimal Precision: 4 Scale: 3 
+1

Questo è esattamente quello che stavo cercando. Ho provato questo nel mio codice e ho ottenuto i valori desiderati. Molte grazie! +1 – IFlyHigh

+0

Solo una domanda aggiuntiva. C'è un modo per ottenere una colonna specifica da Schema. Ad esempio, solo per la colonna Rate come posso ottenere il datarow. Ho fatto questo: 1. Foreach Loop su schemaTbale.rows 2. schemaColName = row.Field ("ColumnName"); 3. Se schemaColName = "Rate" ottiene tutti gli altri dati. Comunque qui per ogni colonna sto attraversando lo schema completoTabella .. Esiste un modo migliore per farlo? Grazie in anticipo. – IFlyHigh

+0

@LittleMissSunshine: perché è un problema? Non dovresti avere dozzine di colonne comunque. Puoi usare LINQ (che è anche un ciclo nascosto): 'var row = tbl.AsEnumerable(). First (r => r.Field (" ColumnName ") ==" Rate ");' –

0

Il DataTable restituito da dataReader.GetSchemaTable() è lo schema del risultato sottostante. Questa tabella contiene, quei molti record di molte colonne nella tabella sottostante. Quindi è necessario scorrere le righe. Ogni riga contiene i metadati della singola colonna della tabella sottostante. È possibile ottenere i metadati della colonna come di seguito

DataTable st = reader.GetSchemaTable(); 
        foreach (DataRow row in st.Rows) 
        { 
         Console.Write(string.Format("ColumnName:{0} DataType:{1} Ordinal:{2} Precision:{3} Size:{4} Scale:{5}", 
          row["ColumnName"], row["DataTypeName"], row["ColumnOrdinal"], 
          row["NumericPrecision"], row["ColumnSize"], row["NumericScale"])); 
        }