无法使用 0000-00-00 00:00:00 值将 MySQL.DateTime 转换为 System.DateTime

Posted

技术标签:

【中文标题】无法使用 0000-00-00 00:00:00 值将 MySQL.DateTime 转换为 System.DateTime【英文标题】:Unable to convert MySQL.DateTime to System.DateTime with 0000-00-00 00:00:00 values 【发布时间】:2013-04-05 14:48:27 【问题描述】:

我正在处理一个 C# 项目,但我遇到了一个问题。该程序允许用户连接到 mysql 数据库并从每个选定的表中检索信息并将数据写入文件。问题是因为我不知道架构会是什么样子或者它会包含什么值。

如果时间戳列包含日期 0000-00-00 00:00:00,我会收到转换错误,无论我尝试什么,它都不会起作用。我尝试转换为字符串 我尝试转换为 DateTime 但我总是得到错误。

以下是我目前尝试获取数据的方式:

using (ConnectMySQLDB db = new ConnectMySQLDB(databaseSettings))

   string query = string.Format("SELECT * FROM 0.1", database, table);
   Console.WriteLine("Query: 0", query);
   using (MySqlCommand cmd = new MySqlCommand(query, db.conn))
   
      using (MySqlDataReader reader = cmd.ExecuteReader())
      
         int i = 1;
         while (reader.Read())
         
            Console.WriteLine("ID: 0", i);
            fieldsAndValues = new Dictionary<string, string>();
            foreach (ColumnDataTypes fieldAndType in fieldsAndTypes)
            
               Console.WriteLine("Column: 0 Type: 1", fieldAndType.field, fieldAndType.dataType);
               string formattedValue = "";
               if (fieldAndType.dataType == "timestamp")
               
                  DateTime date = DateTime.Parse(reader.GetDateTime(fieldAndType.field).ToString());
                  formattedValue = date.ToString("yyyyMMdd");
               

               else
               
                  formattedValue = getDBFormattedValue(reader.GetString(fieldAndType.field), fieldAndType.dataType);
                  fieldsAndValues.Add(fieldAndType.field, formattedValue);
               
            
            rows.Add(fieldsAndValues);
            i++;
         
      
   

我还在连接器字符串中添加了允许零日期和将零日期转换为 null 选项,如下所示:

connString = "server=" + server + ";uid=" + username + ";pwd=" + password + ";port=" + port + ";Allow Zero Datetime=true;zeroDateTimeBehavior=convertToNull;Convert Zero Datetime=true";

【问题讨论】:

为什么要将 DateTime 转换为字符串,然后再将其解析回来?当然,您只希望它返回与开始时相同的 DateTime。 另外,您还没有告诉我们实际发生了什么。你说你得到了“错误”,但没有说那个错误是什么。 顺便问一下,您使用的是哪个 MySQL 连接器?我所看到的关于这些连接字符串选项的所有内容都表明它适用于 Java 驱动程序。您确定您使用的驱动程序支持它们吗? @JonSkeet 错误在标题中。我希望日期以字符串结尾,但我在某处读到您需要转换为 .net 日期时间,然后再转换回字符串 @JonSkeet 我不是 100% 确定他们是否应该工作,从我读到的他们提到 C# 但我可能是错的。我正在使用 mysql 的 ado.net 连接器 【参考方案1】:

查看this documentation,您似乎指定了两个相互矛盾的选项(AllowZeroDateTime=trueConvertZeroDateTime=true)和一个似乎未列出的选项(ZeroDateTimeBehavior=ConvertToNull)。

我建议除非您有实际数据 DateTime.MinValue 并且不想与“零”值混淆,否则您只需指定 ConvertZeroDateTime=true 并检测结果是否是DateTime.MinValue。您绝对不应该调用reader.GetDateTime(),然后将结果转换为字符串,然后再转换回DateTime - 您应该尽可能避免字符串转换,因为它们会搞砸很容易为您准备好。

对于这些“零”值你想要什么字符串值并不是很清楚,但你应该能够很容易地用DateTime.MinValue 对它们进行特殊处理。就我个人而言,我实际上会尽可能地将数据保持在“本机”形式,而不是将所有内容都转换为字符串,但这是一场不同的战斗。

【讨论】:

以上是关于无法使用 0000-00-00 00:00:00 值将 MySQL.DateTime 转换为 System.DateTime的主要内容,如果未能解决你的问题,请参考以下文章

MySql5.7 datetime 默认值为‘0000-00-00 00:00:00'值无法创建问题解决

如何在MySQL DATETIME字段中存储DATE / TIME / YEAR?

MySQL Workbench - 表数据导入向导将所有日期时间对象写入 0000-00-00 00:00:00

将 C# 日期时间转换为 0000-00-00 00:00:00 到 MySQL

如何在java中处理具有值“0000-00-00 00:00:00”的日期[重复]

mysql5.7 datetime 默认值0000-00-00 00:00:00出错