无法使用 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=true
和ConvertZeroDateTime=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