mysql - 如何确定 MySql .Net Connector 的 MySqlDateTime 结构表示的列类型?

标签 mysql datetime mysql-connector

DataColumn.DataType 会返回 FullName = "MySql.Data.Types.MySqlDateTime",无论它表示的列的类型是什么(如果是 DATE、TIME 或 DATETIME)。

显然,我可以查询 information_schema.columns 表,尽管我希望连接器库将此详细信息存储在我在文档中找不到的某个位置。

最佳答案

快速浏览一下 MySQLClient 源代码,我认为您最好的选择是 IDataReader.GetDataTypeName()。这是列数据类型的基础 DBMS 名称。有关(有限的)更多信息,请参阅 MSDN docscorresponding 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");
}

关于mysql - 如何确定 MySql .Net Connector 的 MySqlDateTime 结构表示的列类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1230203/

相关文章:

mysql - 如何通过在 Ruby Rails 平台上运行 sql 脚本来为 mysql 数据库做种?

java - 如何在java中添加n小时

mysql - c程序添加一个用户到mysql

c# - 当 C# 和 mysql 出现问题时,我的事务没有回滚?

c# - MySqlDataReader.GetSchemaTable ColumnOrdinal 是实际数据的+1

php - 如何防止 PHP 中的 SQL 注入(inject)?

php - 在 php 中获取错误的 IP 地址

php - mysqli select 查询不能正常工作

sqlite - 如何让 Superset 识别字符串是日期时间?

python - python中日期时间索引的长度