Pregunta

¿Existe una forma mejor que esta de comprobar si una columna de datos en una tabla de datos es numérica (procedente de una base de datos de SQL Server)?

  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
      }
    }
  }
¿Fue útil?

Solución

No existe una buena forma de comprobar si el tipo es numérico excepto comparándolo con los tipos reales.
Esto es especialmente cierto si el definicion de numerico es un poco diferente (en su caso, según el código, los enteros sin signo no son numéricos).

Otra cosa es que DataColumn.DataType según MSDN solo admite los siguientes tipos:

  • Booleano
  • Byte
  • Carbonizarse
  • Fecha y hora
  • Decimal
  • Doble
  • Int16
  • Int32
  • Int64
  • SByte
  • Soltero
  • Cadena
  • Espacio de tiempo
  • UInt16
  • UInt32
  • UInt64
  • Byte[]

El negrita Los tipos son numéricos (como yo los defino), por lo que debes asegurarte de verificarlos.

Yo personalmente escribiría un método de extensión para el tipo DataColumn (¡no para TYPE!).
Odio el si...entonces...si no cosa así que en su lugar uso un CONJUNTOSEnfoque basado en, como este:

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

Y el uso sería:

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

lo cual es bastante fácil para mí

Otros consejos

Otro método sin el uso de matrices, con sólo una línea de código:

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

Esta línea de código se puede utilizar ya sea como un método de ayuda normal o como un método de extensión.

Tal vez usted podría hacerla más corta con:

System.Type theType = col.DataType AS System.Type
if(theType  == System.Single || theType  == System.Double...) {}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top