使用 C# 和 AllowZeroDatetime 从 MySQL 表获取 DateTime



我使用AllowZeroDatetime选项连接到带有C#的MySQL,当我查询我的表时,它只能部分工作。我回来的日期全是零,但我回来的时间是上午 12:00:00。我该如何解决这个问题?这是我的连接字符串:

string connectionInfo =
@"server=" + @server +
@";userid=" + @username +
@";password=" + @password +
@";database=my_data;" +
@"AllowZeroDatetime=true;";

这是我用来获取日期时间条目的代码:

private static void getSelectGroups(MySqlConnection mysqlConn)
{
     String selectCommand = "SELECT user_date FROM my_table";
    // Set up table reader
    MySqlCommand sqlcmd = new MySqlCommand(selectCommand, mysqlConn);
    MySqlDataReader dataRead = sqlcmd.ExecuteReader();
    while (dataRead.Read())
    {
        Console.WriteLine(dataRead["user_date"]);
    }
}

这是打印出 0/0/0000 12:00:00 AM。我需要它来打印 0/0/0000 00:00:00。

由于dataRead["user_date"]返回 objectConsole.WriteLine(overload)实现为;

if (value == null) {
    WriteLine();
}
else {
    IFormattable f = value as IFormattable;
    if (f != null)
        WriteLine(f.ToString(null, FormatProvider));
    else
        WriteLine(value.ToString());
}

由于 value 不是null并且DateTime实现了IFormattable接口,因此将执行此行;

WriteLine(f.ToString(null, FormatProvider));

这将执行CurrentCulture "G"标准格式说明符,其中ShortDatePatternLongTimePattern属性的组合。

对于您当前的区域性,看起来此组合以d/M/yyyy hh:mm:ss tt格式执行。

对于所需的字符串表示形式,可以使用自定义日期和时间格式,也可以Clone LongTimePattern CurrentCulture将其属性设置为HH:mm:ss 00:00:00表示形式所需的格式并使用此区域性。

Console.WriteLine(((DateTime)dataRead["user_date"]).ToString("d/M/yyyy HH:mm:ss"));

var clone = (CultureInfo)CultureInfo.CurrentCulture.Clone();
clone.DateTimeFormat.LongTimePattern = "HH:mm:ss";
while (dataRead.Read())
{
    Console.WriteLine(((DateTime)dataRead["user_date"]).ToString(clone));
}

00/00/0000对 .NET 中的DateTime无效。 年份必须为 1-9999,月份必须为 1-12,天数必须为 1-N,其中 N 为 28、29、30 或 31,具体取决于月份和年份。

MySql AllowZeroDateTime 选项可解决此问题,如文档中所述:

如果设置为 TrueMySqlDataReader.GetValue()返回具有不允许值(如零日期时间值(的日期或日期时间列的MySqlDateTime对象,以及有效值的System.DateTime对象。如果设置为 False(默认设置(,则会导致为所有有效值返回一个 System.DateTime 对象,并为不允许的值(如零日期时间值(引发异常。

因此,通过将其设置为 True ,您将获得一个MySqlDateTime对象而不是DateTime对象。 请注意,文档的措辞略有错误,因为实现显示当AllowZeroDateTime为 true 时总是返回MySqlDateTime(尽管您仍然可以将有效值转换为 DateTime(。

不幸的是,MySqlDateTime上的ToString方法不如DateTime上的相同方法健壮。 它没有重载来更改字符串的格式。 但是,实现确实使用当前区域性来设置字符串的格式。

您有两种选择:

  1. 实现新的ToString扩展方法

  2. 更改当前线程的区域性设置,以便现有 ToString 方法将使用这些设置进行格式化。

两者都可以工作,但我更喜欢选项 1,因为您不必担心线程安全。 下面是将相同的DateTime.ToString重载添加到MySqlDateTime对象的扩展方法。

public static string ToString(this MySqlDateTime mdt, string format)
{
    return mdt.ToString(format, null);
}
public static string ToString(this MySqlDateTime mdt, string format, IFormatProvider provider)
{
    return mdt.IsValidDateTime 
        ? mdt.GetDateTime().ToString(format, provider) 
        : new DateTime(1, 1, 1).ToString(format, provider).Replace('1', '0');
}

将它们放在静态类中,然后您可以像这样调用它:

MySqlDateTime mdt = (MySqlDateTime) dataRead["user_date"]
Console.WriteLine(mdt.ToString("M/d/yyyy HH:mm:ss"));

相关内容

  • 没有找到相关文章

最新更新