Exemplo n.º 1
0
            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);
                    }
                }
            }