我使用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"]
返回 object
,Console.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"
标准格式说明符,其中ShortDatePattern
和LongTimePattern
属性的组合。
对于您当前的区域性,看起来此组合以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
选项可解决此问题,如文档中所述:
如果设置为
True
,MySqlDataReader.GetValue()
返回具有不允许值(如零日期时间值(的日期或日期时间列的MySqlDateTime
对象,以及有效值的System.DateTime
对象。如果设置为False
(默认设置(,则会导致为所有有效值返回一个System.DateTime
对象,并为不允许的值(如零日期时间值(引发异常。
因此,通过将其设置为 True
,您将获得一个MySqlDateTime
对象而不是DateTime
对象。 请注意,文档的措辞略有错误,因为实现显示当AllowZeroDateTime
为 true 时总是返回MySqlDateTime
(尽管您仍然可以将有效值转换为 DateTime
(。
不幸的是,MySqlDateTime
上的ToString
方法不如DateTime
上的相同方法健壮。 它没有重载来更改字符串的格式。 但是,实现确实使用当前区域性来设置字符串的格式。
您有两种选择:
-
实现新的
ToString
扩展方法 -
更改当前线程的区域性设置,以便现有
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"));