2009-08-04 2 views
2

DataColumn.DataType возвращает FullName = "MySql.Data.Types.MySqlDateTime" независимо от типа столбца, который он представляет, если это либо DATE, TIME, либо DATETIME.Как определить тип столбца, представленный структурой MySqlDateTime MySql .Net Connector?

Очевидно, что я могу запросить таблицу information_schema.columns, хотя я надеюсь, что библиотека соединителей хранит эту деталь где-то, чего я просто не могу найти в документации.

ответ

5

С быстрым взглядом на исходный код MySQLClient, я думаю, что ваш лучший выбор - IDataReader.GetDataTypeName(). Это имя базовой СУБД для типа данных столбца. Для (ограниченного количества) дополнительной информации см. MSDN docs и corresponding MySQL docs для этого свойства.

Вот источник из MySqlDateTime.cs для этого объекта, который выглядит многообещающим:

string IMySqlValue.MySqlTypeName 
{ 
get 
{ 
    switch (type) 
    { 
    case MySqlDbType.Date: return "DATE"; 
    case MySqlDbType.Newdate: return "NEWDATE"; 
    case MySqlDbType.Timestamp: return "TIMESTAMP"; 
    } 
    return "DATETIME"; 
} 
} 

Вот другая функция полезности вы можете заимствовать код из MetaData.cs:

public static MySqlDbType NameToType(string typeName, bool unsigned, 
    bool realAsFloat, MySqlConnection connection) 
{ 
switch (typeName.ToUpper(CultureInfo.InvariantCulture)) 
{ 
    case "CHAR": return MySqlDbType.String; 
    case "VARCHAR": return MySqlDbType.VarChar; 
    case "DATE": return MySqlDbType.Date; 
    case "DATETIME": return MySqlDbType.DateTime; 
    case "NUMERIC": 
    case "DECIMAL": 
    case "DEC": 
    case "FIXED": 
    if (connection.driver.Version.isAtLeast(5, 0, 3)) 
    return MySqlDbType.NewDecimal; 
    else 
    return MySqlDbType.Decimal; 
    case "YEAR": 
    return MySqlDbType.Year; 
    case "TIME": 
    return MySqlDbType.Time; 
    case "TIMESTAMP": 
    return MySqlDbType.Timestamp; 
    case "SET": return MySqlDbType.Set; 
    case "ENUM": return MySqlDbType.Enum; 
    case "BIT": return MySqlDbType.Bit; 

    case "TINYINT": 
      return unsigned ? MySqlDbType.UByte : MySqlDbType.Byte; 
    case "BOOL": 
    case "BOOLEAN": 
    return MySqlDbType.Byte; 
    case "SMALLINT": 
    return unsigned ? MySqlDbType.UInt16 : MySqlDbType.Int16; 
    case "MEDIUMINT": 
    return unsigned ? MySqlDbType.UInt24 : MySqlDbType.Int24; 
    case "INT": 
    case "INTEGER": 
    return unsigned ? MySqlDbType.UInt32 : MySqlDbType.Int32; 
    case "SERIAL": 
    return MySqlDbType.UInt64; 
    case "BIGINT": 
    return unsigned ? MySqlDbType.UInt64 : MySqlDbType.Int64; 
    case "FLOAT": return MySqlDbType.Float; 
    case "DOUBLE": return MySqlDbType.Double; 
    case "REAL": return 
    realAsFloat ? MySqlDbType.Float : MySqlDbType.Double; 
     case "TEXT": 
      return MySqlDbType.Text; 
     case "BLOB": 
    return MySqlDbType.Blob; 
    case "LONGBLOB": 
      return MySqlDbType.LongBlob; 
     case "LONGTEXT": 
      return MySqlDbType.LongText; 
    case "MEDIUMBLOB": 
      return MySqlDbType.MediumBlob; 
     case "MEDIUMTEXT": 
      return MySqlDbType.MediumText; 
    case "TINYBLOB": 
      return MySqlDbType.TinyBlob; 
    case "TINYTEXT": 
    return MySqlDbType.TinyText; 
     case "BINARY": 
      return MySqlDbType.Binary; 
     case "VARBINARY": 
      return MySqlDbType.VarBinary; 
} 
throw new MySqlException("Unhandled type encountered"); 
} 
+0

Спасибо. Это может оказаться полезным для будущих проектов. Однако почти весь мой код основан на заполнении объектов DataTable DataAdapter.Fill(), а не на использовании DataReader. – dvogel

Смежные вопросы