3

我正在开发一个 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++;
         }
      }
   }
}

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

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

1 回答 1

11

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

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

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

于 2013-04-12T23:06:22.993 回答