我正在开发一个 C# 项目,但遇到了一个问题。该程序允许用户连接到 MySQL 数据库并从每个选定的表中检索信息并将数据写入文件。问题是因为我不知道架构会是什么样子或者它会包含什么值。
如果时间戳列包含日期 0000-00-00 00:00:00 我会收到转换错误,并且无论我尝试什么,它都不会起作用。我尝试转换为字符串我尝试转换为日期时间但我总是收到错误。
以下是我目前尝试获取数据的方式:
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++;
}
}
}
}
我还在连接器字符串中添加了允许零日期和将零日期转换为空选项,如下所示:
connString = "server=" + server + ";uid=" + username + ";pwd=" + password + ";port=" + port + ";Allow Zero Datetime=true;zeroDateTimeBehavior=convertToNull;Convert Zero Datetime=true";
看着本文档 http://dev.mysql.com/doc/connector-net/en/connector-net-connection-options.html,看起来您指定了两个矛盾的选项(AllowZeroDateTime=true
and ConvertZeroDateTime=true
)和一个似乎未列出的(ZeroDateTimeBehavior=ConvertToNull
).
我建议除非你有实际数据DateTime.MinValue
您不想将其与“零”值混淆,您just指定ConvertZeroDateTime=true
并检测结果是否为DateTime.MinValue
。你绝对不应该 call reader.GetDateTime()
,然后将结果转换为字符串,然后再转换回DateTime
- 你应该尽可能避免字符串转换,因为它们很容易把事情搞砸。
目前尚不清楚您想要这些“零”值的字符串值,但您应该能够将它们特殊化DateTime.MinValue
相当容易。就个人而言,我实际上会尝试尽可能地将数据保持在其“本机”形式,而不是将所有内容都转换为字符串,但这是一场不同的战斗。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)