2009-11-12 15 views
13

Gibt es einen besseren Weg, um zu überprüfen, ob eine DataColumn in einer DataTable numerisch ist (aus einer SQL Server-Datenbank stammt)?Ermitteln, ob DataColumn numerisch ist

Database db = DatabaseFactory.CreateDatabase(); 
    DbCommand cmd = db.GetStoredProcCommand("Get_Some_Data"); 
    DataSet ds = db.ExecuteDataSet(cmd); 

    foreach (DataTable tbl in ds.Tables) { 
    foreach (DataColumn col in tbl.Columns) { 
     if (col.DataType == typeof(System.Single) 
     || col.DataType == typeof(System.Double) 
     || col.DataType == typeof(System.Decimal) 
     || col.DataType == typeof(System.Byte) 
     || col.DataType == typeof(System.Int16) 
     || col.DataType == typeof(System.Int32) 
     || col.DataType == typeof(System.Int64)) { 
     // this column is numeric 
     } else { 
     // this column is not numeric 
     } 
    } 
    } 

Antwort

36

Es gibt keine gute Möglichkeit zu überprüfen, ob der Typ es um die tatsächlichen Typen außer Vergleich numerisch ist.
Dies gilt insbesondere, wenn die Definition von numerischen ein bisschen anders ist (in Ihrem Fall, nach dem Code, - vorzeichenlose Ganzzahlen sind keine Zahlen).

Eine andere Sache ist, dass DataColumn.DataType according to MSDN nur folgende Typen unterstützt:

  • Boolean
  • Byte
  • Char
  • Datetime
  • Dezimal
  • Doppel
  • Int16
  • Int32
  • Int64
  • SByte
  • Einzel
  • String
  • Span
  • UInt16
  • UInt32
  • UInt64
  • Byte []

Die bolded Typen sind Numerik (wie ich es definieren), so müssen Sie sicherstellen, dass Sie überprüfen Sie.

Ich persönlich würde eine Erweiterungsmethode für den DataColumn-Typ schreiben (nicht für den TYPE!).
Ich hasse die wenn ... dann ..sonst Sache so stattdessen verwende ich eine SETS basierten Ansatz, wie folgt aus:

public static bool IsNumeric(this DataColumn col) { 
    if (col == null) 
    return false; 
    // Make this const 
    var numericTypes = new [] { typeof(Byte), typeof(Decimal), typeof(Double), 
     typeof(Int16), typeof(Int32), typeof(Int64), typeof(SByte), 
     typeof(Single), typeof(UInt16), typeof(UInt32), typeof(UInt64)}; 
    return numericTypes.Contains(col.DataType); 
} 

Und wäre die Nutzung:

if (col.IsNumeric()) .... 

, die mir leicht genug ist

+2

+1 für Extension-Methode, hält den Schmerz 1 Platz –

+0

Ich habe die unsigned Integer-Typen nicht enthalten, weil sie nicht in http://msdn.microsoft.com/en-us/library/ms131092%28SQL aufgeführt wurden .90% 29.aspx, aber ich mag Ihren Ansatz. – JustinStolle

+0

@JustinStolle, ich würde besser die vorzeichenlosen Typen entsprechend der MSDN Seite einschließen, die ich zur Verfügung stellte. Die Seite, auf die Sie verweisen, ist die SQL Server 2005-spezifische. –

1

Vielleicht könnten Sie es kürzer machen:

System.Type theType = col.DataType AS System.Type 
if(theType == System.Single || theType == System.Double...) {} 
2

Eine andere Methode ohne Verwendung von Arrays, nur durch eine Zeile Code:

return col != null && "Byte,Decimal,Double,Int16,Int32,Int64,SByte,Single,UInt16,UInt32,UInt64,".Contains(col.DataType.Name + ","); 

Diese Codezeile kann entweder als normale Hilfsmethode oder als Erweiterungsmethode verwendet werden.

Verwandte Themen