static void FixColumnType(DataColumn column) { if (column.DataType == typeof(object)) { Type colType = null; foreach (DataRow row in column.Table.Rows) { var value = row[column]; if (value == null || value == DBNull.Value) { continue; } var valType = value.GetType(); if (colType == null) { colType = valType; } else if (colType != valType) { var colTypeCode = Type.GetTypeCode(colType); var valTypeCode = Type.GetTypeCode(valType); switch (colTypeCode) { case TypeCode.Empty: colType = valType; break; case TypeCode.Object: colType = typeof(object); break; case TypeCode.DBNull: colType = valType; break; case TypeCode.Boolean: if (IsTypeCode(valTypeCode, TypeCode.Byte, TypeCode.SByte, TypeCode.Int16, TypeCode.UInt16, TypeCode.Int32, TypeCode.UInt32, TypeCode.Int64, TypeCode.UInt64, TypeCode.Single, TypeCode.Double, TypeCode.Decimal, TypeCode.DateTime)) { colType = valType; } else if (IsTypeCode(valTypeCode, TypeCode.Char, TypeCode.String)) { colType = typeof(string); } else if (IsTypeCode(valTypeCode, TypeCode.Object)) { colType = typeof(object); } break; case TypeCode.Char: if (IsTypeCode(valTypeCode, TypeCode.String, TypeCode.Byte, TypeCode.SByte, TypeCode.Int16, TypeCode.UInt16, TypeCode.Int32, TypeCode.UInt32, TypeCode.Int64, TypeCode.UInt64, TypeCode.Single, TypeCode.Double, TypeCode.Decimal, TypeCode.DateTime)) { colType = typeof(string); } else if (IsTypeCode(valTypeCode, TypeCode.Object)) { colType = typeof(object); } break; case TypeCode.SByte: if (IsTypeCode(valTypeCode, TypeCode.Byte)) { colType = typeof(short); } else if (IsTypeCode(valTypeCode, TypeCode.Int16, TypeCode.UInt16, TypeCode.Int32, TypeCode.UInt32, TypeCode.Int64, TypeCode.UInt64, TypeCode.Single, TypeCode.Double, TypeCode.Decimal, TypeCode.DateTime)) { colType = valType; } else if (IsTypeCode(valTypeCode, TypeCode.Char, TypeCode.String)) { colType = typeof(string); } else if (IsTypeCode(valTypeCode, TypeCode.Object)) { colType = typeof(object); } break; case TypeCode.Byte: if (IsTypeCode(valTypeCode, TypeCode.SByte)) { colType = typeof(short); } else if (IsTypeCode(valTypeCode, TypeCode.Int16, TypeCode.UInt16, TypeCode.Int32, TypeCode.UInt32, TypeCode.Int64, TypeCode.UInt64, TypeCode.Single, TypeCode.Double, TypeCode.Decimal, TypeCode.DateTime)) { colType = valType; } else if (IsTypeCode(valTypeCode, TypeCode.Char, TypeCode.String)) { colType = typeof(string); } else if (IsTypeCode(valTypeCode, TypeCode.Object)) { colType = typeof(object); } break; case TypeCode.Int16: if (IsTypeCode(valTypeCode, TypeCode.Byte, TypeCode.SByte)) { colType = typeof(short); } else if (IsTypeCode(valTypeCode, TypeCode.UInt16)) { colType = typeof(int); } else if (IsTypeCode(valTypeCode, TypeCode.Int32, TypeCode.UInt32, TypeCode.Int64, TypeCode.UInt64, TypeCode.Single, TypeCode.Double, TypeCode.Decimal, TypeCode.DateTime)) { colType = valType; } else if (IsTypeCode(valTypeCode, TypeCode.Char, TypeCode.String)) { colType = typeof(string); } else if (IsTypeCode(valTypeCode, TypeCode.Object)) { colType = typeof(object); } break; case TypeCode.UInt16: if (IsTypeCode(valTypeCode, TypeCode.Byte, TypeCode.SByte)) { colType = typeof(int); } else if (IsTypeCode(valTypeCode, TypeCode.Int16)) { colType = typeof(int); } else if (IsTypeCode(valTypeCode, TypeCode.Int32, TypeCode.UInt32, TypeCode.Int64, TypeCode.UInt64, TypeCode.Single, TypeCode.Double, TypeCode.Decimal, TypeCode.DateTime)) { colType = valType; } else if (IsTypeCode(valTypeCode, TypeCode.Char, TypeCode.String)) { colType = typeof(string); } else if (IsTypeCode(valTypeCode, TypeCode.Object)) { colType = typeof(object); } break; case TypeCode.Int32: if (IsTypeCode(valTypeCode, TypeCode.Byte, TypeCode.SByte, TypeCode.Int16, TypeCode.UInt16)) { colType = typeof(int); } else if (IsTypeCode(valTypeCode, TypeCode.UInt32)) { colType = typeof(long); } else if (IsTypeCode(valTypeCode, TypeCode.Int64, TypeCode.UInt64, TypeCode.Single, TypeCode.Double, TypeCode.Decimal, TypeCode.DateTime)) { colType = valType; } else if (IsTypeCode(valTypeCode, TypeCode.Char, TypeCode.String)) { colType = typeof(string); } else if (IsTypeCode(valTypeCode, TypeCode.Object)) { colType = typeof(object); } break; case TypeCode.UInt32: if (IsTypeCode(valTypeCode, TypeCode.Byte, TypeCode.SByte, TypeCode.Int16, TypeCode.UInt16)) { colType = typeof(long); } else if (IsTypeCode(valTypeCode, TypeCode.Int32)) { colType = typeof(long); } else if (IsTypeCode(valTypeCode, TypeCode.Int64, TypeCode.UInt64, TypeCode.Single, TypeCode.Double, TypeCode.Decimal, TypeCode.DateTime)) { colType = valType; } else if (IsTypeCode(valTypeCode, TypeCode.Char, TypeCode.String)) { colType = typeof(string); } else if (IsTypeCode(valTypeCode, TypeCode.Object)) { colType = typeof(object); } break; case TypeCode.Int64: if (IsTypeCode(valTypeCode, TypeCode.Byte, TypeCode.SByte, TypeCode.Int16, TypeCode.UInt16, TypeCode.Int32, TypeCode.UInt32)) { colType = typeof(long); } else if (IsTypeCode(valTypeCode, TypeCode.UInt64)) //anyway leave unsigned { colType = typeof(long); } else if (IsTypeCode(valTypeCode, TypeCode.Single, TypeCode.Double, TypeCode.Decimal, TypeCode.DateTime)) { colType = valType; } else if (IsTypeCode(valTypeCode, TypeCode.Char, TypeCode.String)) { colType = typeof(string); } else if (IsTypeCode(valTypeCode, TypeCode.Object)) { colType = typeof(object); } break; case TypeCode.UInt64: if (IsTypeCode(valTypeCode, TypeCode.Byte, TypeCode.SByte, TypeCode.Int16, TypeCode.UInt16, TypeCode.Int32, TypeCode.UInt32)) { colType = typeof(long); } else if (IsTypeCode(valTypeCode, TypeCode.Int64)) //anyway leave unsigned { colType = typeof(long); } else if (IsTypeCode(valTypeCode, TypeCode.Single, TypeCode.Double, TypeCode.Decimal, TypeCode.DateTime)) { colType = valType; } else if (IsTypeCode(valTypeCode, TypeCode.Char, TypeCode.String)) { colType = typeof(string); } else if (IsTypeCode(valTypeCode, TypeCode.Object)) { colType = typeof(object); } break; case TypeCode.Single: if (IsTypeCode(valTypeCode, TypeCode.Byte, TypeCode.SByte, TypeCode.Int16, TypeCode.UInt16, TypeCode.Int32, TypeCode.UInt32, TypeCode.Int64, TypeCode.UInt64)) { colType = typeof(float); } else if (IsTypeCode(valTypeCode, TypeCode.Double)) { colType = typeof(double); } else if (IsTypeCode(valTypeCode, TypeCode.Decimal, TypeCode.DateTime)) { colType = valType; } else if (IsTypeCode(valTypeCode, TypeCode.Char, TypeCode.String)) { colType = typeof(string); } else if (IsTypeCode(valTypeCode, TypeCode.Object)) { colType = typeof(object); } break; case TypeCode.Double: if (IsTypeCode(valTypeCode, TypeCode.Byte, TypeCode.SByte, TypeCode.Int16, TypeCode.UInt16, TypeCode.Int32, TypeCode.UInt32, TypeCode.Int64, TypeCode.UInt64, TypeCode.Single)) { colType = typeof(double); } else if (IsTypeCode(valTypeCode, TypeCode.Decimal, TypeCode.DateTime)) { colType = valType; } else if (IsTypeCode(valTypeCode, TypeCode.Char, TypeCode.String)) { colType = typeof(string); } else if (IsTypeCode(valTypeCode, TypeCode.Object)) { colType = typeof(object); } break; case TypeCode.Decimal: if (IsTypeCode(valTypeCode, TypeCode.Byte, TypeCode.SByte, TypeCode.Int16, TypeCode.UInt16, TypeCode.Int32, TypeCode.UInt32, TypeCode.Int64, TypeCode.UInt64, TypeCode.Single, TypeCode.Double, TypeCode.DateTime)) { colType = typeof(decimal); } else if (IsTypeCode(valTypeCode, TypeCode.Char, TypeCode.String)) { colType = typeof(string); } else if (IsTypeCode(valTypeCode, TypeCode.Object)) { colType = typeof(object); } break; case TypeCode.DateTime: if (IsTypeCode(valTypeCode, TypeCode.Byte, TypeCode.SByte, TypeCode.Int16, TypeCode.UInt16, TypeCode.Int32, TypeCode.UInt32, TypeCode.Int64, TypeCode.UInt64, TypeCode.Single, TypeCode.Double, TypeCode.Decimal)) { colType = typeof(decimal); } else if (IsTypeCode(valTypeCode, TypeCode.Char, TypeCode.String)) { colType = typeof(string); } else if (IsTypeCode(valTypeCode, TypeCode.Object)) { colType = typeof(object); } break; case TypeCode.String: if (IsTypeCode(valTypeCode, TypeCode.Byte, TypeCode.SByte, TypeCode.Int16, TypeCode.UInt16, TypeCode.Int32, TypeCode.UInt32, TypeCode.Int64, TypeCode.UInt64, TypeCode.Single, TypeCode.Double, TypeCode.Decimal, TypeCode.DateTime, TypeCode.Char)) { colType = typeof(string); } if (IsTypeCode(valTypeCode, TypeCode.Object)) { colType = typeof(object); } break; default: break; } } } if (colType != null && colType != column.DataType) { column.ConvertColumnType(colType); } } }