如何确定 DataColumn 的类型是数字、字符串还是日期时间?

3

我需要根据DataTable中DataColumns的类型来格式化输出。

具体而言,我需要将内置的原始类型(int、string、decimal、DateTime等)映射到:

  • SomeEnum.Numeric
  • SomeEnum.Bool
  • SomeEnum.DateTime
  • SomeEnum.String
  • SomeEnum.Unknown
  • SomeEnum.Null

我该如何做?

2个回答

10

如果内置的 TypeCode 枚举符合您的需求,则可以直接读取 DataColumnDataType 属性,然后调用 GetTypeCode

TypeCode yourTypeCode = Type.GetTypeCode(yourDataColumn.DataType);

switch (yourTypeCode)
{
    case TypeCode.Byte:
    case TypeCode.SByte:
    case TypeCode.Int16
    case TypeCode.UInt16:
    case TypeCode.Int32:
    case TypeCode.UInt32:
    case TypeCode.Int64:
    case TypeCode.UInt64:
    case TypeCode.Single:
    case TypeCode.Double:
    case TypeCode.Decimal:
        Console.WriteLine("Numeric");
        break;
    case TypeCode.Boolean:
        Console.WriteLine("Bool");
        break;
    case TypeCode.DateTime:
        Console.WriteLine("DateTime");
        break;
    case TypeCode.String:
        Console.WriteLine("String");
        break;
    case TypeCode.Empty:
        Console.WriteLine("Null");
        break;
    default:    // TypeCode.DBNull, TypeCode.Char and TypeCode.Object
        Console.WriteLine("Unknown");
        break;
}

如果 TypeCode 不能满足你的需求,那么你可以按照 John's answer 中所述,将列类型简单地转换为自定义的枚举类型。

我可以返回SomeEnum的值,而不是写cout。 看起来不错。 - Jeff Meatball Yang
+1 谢谢,我不知道你可以像这样切换内置类型 - 直到现在我不得不使用自定义字典来实现这一点。 - mfeineis

1

你可以使用:

var types = new Dictionary<Type, SomeEnum>()
{
    { typeof(int), SomeEnum.Numeric },
    { typeof(long), SomeEnum.Numeric },
    { typeof(string), SomeEnum.String },
    ...
};

Func<Type, object, SomeEnum> getTypeEnum = (type, obj) =>
{
    var result = types.ContainsKey(type)
                     ? types[type]
                     : SomeEnum.Unknown;
    if (obj == null || obj is DBNull)
    {
        result = SomeEnum.Null;
    }

    return result;
};

...

var e = getTypeEnum(col.DataType, row[col]);

这也是我的解决方案。只有17种允许的类型 - Matthew Flaschen
我喜欢类型推断、lambda和对象构造的繁荣。 :) - Jeff Meatball Yang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接