Search code examples
mysqldatetimemysql-connector

How can I determine the column type represented by a MySql .Net Connector's MySqlDateTime structure?


DataColumn.DataType returns FullName = "MySql.Data.Types.MySqlDateTime" regardless of the type of the column it represents, if it is either DATE, TIME, or DATETIME.

Clearly I can query the information_schema.columns table, though I'm hoping that the connector library stores this detail somewhere that I just can't find in the documentation.


Solution

  • From a quick look at the MySQLClient source code, I think your best choice is IDataReader.GetDataTypeName(). This is the underlying DBMS's name for the data type of a column. For (a limited amount of) more info, see the MSDN docs and the corresponding MySQL docs for this property.

    Here's the source from MySqlDateTime.cs for this property, which looks promising:

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

    Here's another utility function you may want to borrow the code of, from 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");
    }