Определите, является ли DataColumn числовым - PullRequest
15 голосов
/ 13 ноября 2009

Есть ли лучший способ проверить, является ли DataColumn в DataTable числовым (исходя из базы данных 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
      }
    }
  }

Ответы [ 3 ]

38 голосов
/ 13 ноября 2009

Нет хорошего способа проверить, является ли тип числовым, кроме сравнения его с фактическими типами.
Это особенно верно, если числовое определение немного отличается (1003 *) (в вашем случае, согласно коду, целые числа без знака не являются числовыми).

Другое дело, что DataColumn.DataType в соответствии с MSDN поддерживает только следующие типы:

  • Boolean
  • Байт
  • Char
  • DateTime
  • Десятичные
  • Double
  • Int16
  • Int32
  • Int64
  • SByte
  • Single
  • Строка
  • TimeSpan
  • UInt16
  • UInt32
  • UInt64
  • Byte []

Типы , выделенные полужирным шрифтом , являются числовыми (как я их определяю), поэтому вам нужно обязательно их проверить.

Лично я бы написал метод расширения для типа DataColumn (не для ТИПА!).
Я ненавижу вещь if ... then..else , поэтому вместо этого я использую подход SETS , например:

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

И использование будет:

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

что достаточно легко для меня

2 голосов
/ 23 сентября 2013

Другой метод без использования массивов, всего одной строкой кода:

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

Эта строка кода может использоваться как обычный вспомогательный метод или как метод расширения.

1 голос
/ 13 ноября 2009

Может быть, вы могли бы сделать его короче с:

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