2009-11-12 6 views
13

Existe-t-il une meilleure méthode pour vérifier si un DataColumn dans un DataTable est numérique (provenant d'une base de données SQL Server)?Déterminez si DataColumn est numérique

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 
     } 
    } 
    } 

Répondre

36

Il n'y a pas de bonne façon de vérifier si le type est numérique, sauf en le comparant aux types réels.
Ceci est particulièrement vrai si la définition du numérique est un peu différente (dans votre cas, selon le code, - les entiers non signés ne sont pas numériques).

Une autre chose est que DataColumn.DataType according to MSDN prend en charge que les types suivants:

  • Boolean
  • Byte
  • Char
  • DateTime
  • décimal
  • Double
  • Int16
  • Int32
  • Int64
  • SByte
  • simple
  • Chaîne
  • TimeSpan
  • UInt16
  • UInt32
  • UInt64
  • Byte []

Les bolded types sont des valeurs numériques (comme je le définis) de sorte que vous devez vous assurer que vous vérifier leur.

Personnellement, j'écrirais une méthode d'extension pour le type DataColumn (pas pour le TYPE!). Je déteste le si ... alors ..autre chose donc au lieu-je utiliser un ENSEMBLES approche fondée, comme ceci:

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); 
} 

Et l'utilisation serait:

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

qui est assez facile pour moi

+2

+1 pour la méthode d'extension, conserve la douleur 1 place –

+0

Je n'ai pas inclus les types entiers non signés car ils n'étaient pas répertoriés dans http://msdn.microsoft.com/fr-fr/library/ms131092%28SQL 90% 29.aspx mais j'aime votre approche. – JustinStolle

+0

@JustinStolle, je ferais mieux d'inclure les types non signés en fonction de la page MSDN que j'ai fournie. La page que vous référence est spécifique à SQL Server 2005. –

1

Peut-être que vous pourriez en faire plus court avec:

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

Une autre méthode sans utiliser les tableaux, juste par une ligne de code:

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

Cette ligne de code peut être utilisée comme méthode d'aide normale ou comme méthode d'extension.