2014-06-11 3 views
7

Gibt es eine Möglichkeit, den genauen Typ einer Spalte in einer DataTable zu kennen? Im Moment bin ich dies zu tun:So erhalten Sie den genauen Typ numerischer Spalten inkl. Maßstab und Präzision?

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

Jetzt mit type.Name ich in der Lage bin zu finden, wenn es eine Zahl ist (int oder decimal ..) oder string aber das Problem ist, dass ich den genauen Typ benötigen, beispielsweise wenn in der Datenbank lassen Sie sagen, Spalte Rate ist NUMBER(4,3) dann hier in meinem Code bekomme ich nur Typ als "Dezimal" und keine Informationen über das Format 4,3.

Jetzt ist die Voraussetzung, ich muss die Werte nach ihrem Typ für zB formatieren. wenn Rate=1.4 sollte es als 0001.400 (nach dem Format NUMBER(4,3)) angezeigt werden. Da ich hier keine Informationen habe, kann ich die Werte nicht weiter verarbeiten. Gibt es denn eh dasselbe zu wissen?

Dank

+0

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

+0

Schleife Throught jede Zeile aka DataRow und mit Reflection getType der einzelnen .. –

+0

Sie müssen sich die zusätzlichen Attribute in der Spalte ansehen, um genau zu bestimmen. Betrachten Sie zum Beispiel NumericPrecision und NumericScale Eigenschaften http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getschematable%28v=vs.110%29.aspx – dmarietta

Antwort

5

können Sie verwenden NumericPrecision und 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); 
     } 
    } 
} 

Weitere Informationen:

: GetSchemaTable

Ich habe es mit einer frischen Tabelle mit einer einzigen Spalte numeric(4, 3)NumberColumn des Typs getestet

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

Genau das habe ich gesucht. Ich habe das in meinem Code probiert und die gewünschten Werte bekommen. Danke vielmals! +1 – IFlyHigh

+0

Nur eine Zusatzfrage. Gibt es eine Möglichkeit, bestimmte Spalten-Datarow von Schema-Tabelle zu erhalten. Zum Beispiel nur für Rate Spalte, wie kann ich den Datarow bekommen. Ich habe das getan: 1. Foreach-Schleife auf schemaTbale.rows 2. schemaColName = row.Field ("ColumnName"); 3. Wenn schemaColName = "Rate" erhält alle anderen Daten. Allerdings durchquere ich hier für jede Spalte die komplette SchemaTabelle. Gibt es einen besseren Weg dies zu tun? Danke im Voraus. – IFlyHigh

+0

@LittleMissSunshine: Warum ist das ein Problem? Sie sollten sowieso nicht Dutzende von Spalten haben. Sie können LINQ verwenden (was auch eine versteckte Schleife ist): 'var row = tbl.AsEnumerable(). Zuerst (r => r.Field (" ColumnName ") ==" Rate ");' –

0

Die von dataReader.GetSchemaTable() zurückgegebene DataTable ist das Schema des zugrunde liegenden Ergebnisses. Diese Tabelle enthält so viele Datensätze wie viele Spalten in der zugrunde liegenden Tabelle. Sie müssen also die Zeilen durchlaufen. Jede Zeile enthält die Metadaten der einzelnen Spalte der zugrunde liegenden Tabelle. Sie können die Metadaten der Spalte erhalten, wie unten

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"])); 
        } 
Verwandte Themen