18

有没有比这更好的方法来检查 DataTable 中的 DataColumn 是否为数字(来自 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
      }
    }
  }
4

3 回答 3

42

除了将其与实际类型进行比较之外,没有很好的方法来检查类型是否为数字。
如果数字的定义有点不同(在您的情况下,根据代码,无符号整数不是数字),则尤其如此。

另一件事是DataColumn.DataType 根据 MSDN仅支持以下类型:

  • 布尔值
  • 字节
  • 字符
  • 约会时间
  • 十进制
  • 双倍的
  • 16
  • 整数32
  • 整数64
  • 字节
  • 单身的
  • 细绳
  • 时间跨度
  • UInt16
  • UInt32
  • UInt64
  • 字节[]

粗体类型是数字(正如我定义的那样),因此您需要确保检查它们。

我个人会为 DataColumn 类型(而不是 TYPE!)编写扩展方法。
我讨厌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()) ....

这对我来说很容易

于 2009-11-12T23:04:57.553 回答
2

另一种不使用数组的方法,只需一行代码:

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

这行代码既可以用作普通的辅助方法,也可以用作扩展方法。

于 2013-09-23T10:53:49.807 回答
1

也许你可以缩短它:

System.Type theType = col.DataType AS System.Type
if(theType  == System.Single || theType  == System.Double...) {}
于 2009-11-12T22:51:30.710 回答