我正在开发一个C#项目,我正面临着一个问题.该程序允许用户连接到MySQL数据库并从每个选定的表中检索信息并将数据写入文件.问题是因为我不知道架构会是什么样的,或者它将包含什么值.
如果timestamp列包含date 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++;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还在连接器字符串中添加了allow zero date和convertzerodate to null选项,如下所示:
connString = "server=" + server + ";uid=" + username + ";pwd=" + password + ";port=" + port + ";Allow Zero Datetime=true;zeroDateTimeBehavior=convertToNull;Convert Zero Datetime=true";
Run Code Online (Sandbox Code Playgroud)
看一下这个文档,看起来你正在指定两个相互矛盾的选项(AllowZeroDateTime=true和ConvertZeroDateTime=true)和一个看起来没有列出的选项(ZeroDateTimeBehavior=ConvertToNull).
我建议除非你有实际的数据,DateTime.MinValue你不想与"零"值混淆,你只需指定ConvertZeroDateTime=true并检测结果是否正确DateTime.MinValue.你绝对不应该调用reader.GetDateTime(),然后将结果转换为字符串,然后返回到DateTime- 你应该尽可能地避免字符串转换,因为它们可以很容易地为你搞清楚.
对于这些"零"值,你想要的是什么字符串值并不是很清楚,但是你应该能够DateTime.MinValue非常轻松地对它们进行特殊处理.就个人而言,我实际上尽可能地将数据保持为"原生"形式,而不是将所有内容转换为字符串,但这是一场不同的战斗.
| 归档时间: |
|
| 查看次数: |
6266 次 |
| 最近记录: |