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++;
         }
      }
   }
}

次のように、コネクタ文字列に 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";
4

1 に答える 1

11

このドキュメントを見ると、矛盾する 2 つのオプション (AllowZeroDateTime=trueConvertZeroDateTime=true) と、リストされていないように見える 1 つのオプション ( ) を指定しているようですZeroDateTimeBehavior=ConvertToNull

DateTime.MinValue「ゼロ」値と混同したくない実際のデータがない限り、結果が であるかどうかを指定して検出することをお勧めします呼び出し、結果を文字列に変換してから a に戻すことは絶対に避けてください。ConvertZeroDateTime=trueDateTime.MinValuereader.GetDateTime()DateTime

DateTime.MinValueこれらの「ゼロ」値に必要な文字列値は明確ではありませんが、かなり簡単に特別なケースにできるはずです。個人的には、すべてを文字列に変換するのではなく、データを可能な限り「ネイティブ」な形式に保つように実際に試みますが、それは別の戦いです。

于 2013-04-12T23:06:22.993 に答える