私には本当に奇妙に思えるいくつかの問題があり、なぜこれが起こっているのか理解できません。
基本的に、私は DateTime.ParseExact を実行しようとしています。これは、あるケースでは機能するが、他のケースでは機能しない場合です。
この文字列を日付文字列として持っているとしましょう:
"11/02/2015 11:59:06:313"
メソッドに文字列の明示的な宣言、つまり次のコードを指定して解析すると、すべて正常に動作します。
DateTime.ParseExact("11/02/2015 11:59:06:313", "dd/MM/yyyy HH:mm:ss:fff", null);
これを動的な値として配置すると(これが必要です)、次のコードで「有効な DateTime 形式として認識されない文字列」が表示されます。
DateTime.ParseExact(item.original, "dd/MM/yyyy HH:mm:ss:fff", null);
Convert.ToDateTime メソッドも試しました (同じ例外がスローされました)。
Convert.ToDateTime(item.original).ToString("dd/MM/yyyy HH:mm:ss:fff");
「item.original」変数はクラスから取得されます (これは、そのクラスの文字列プロパティであり、次のように定義されます)
public class XmlData
{
public string tableName { get; set; }
public string columnName { get; set; }
public string original { get; set; }
public int required { get; set; }
public string status { get; set; }
public string type { get; set; }
public string newValue { get; set; }
}
私はここで本当に迷っています。なぜこれが起こっているのか、誰にとっても理にかなっていますか?
編集
問題はさらに背後にある可能性があるため、これがどのように使用されているかについてもう少し情報を提供することにしました。
リフレクションを使用して DataTable を作成するプロパティのみを定義するために使用しているクラスがあります。
クラスには次のプロパティがあります。
public DateTime last_date { get; set; }
次に、このメソッドを使用して DataTable を構築しています。
public DataTable CreateEmptyDataTable(Type myType)
{
DataTable dt = new DataTable();
foreach (PropertyInfo info in myType.GetProperties())
{
dt.Columns.Add(new DataColumn(info.Name, info.PropertyType));
}
return dt;
}
DataTable を初期化した後、XmlData クラスから値を読み取り、次のコードを使用して次のように last_date 列に値を代入します。
//Set the original state
foreach (XmlData item in collection)
{
if (item.tableName == "vehicle")
{
if (item.original == "--NULL--")
dr[item.columnName.Substring(item.tableName.Length + 1)] = DBNull.Value;
else
{
if (item.type == "DT") //DateTime in format "dd/MM/yyyy HH:mm:ss:fff"
dr[item.columnName.Substring(item.tableName.Length + 1)] = DateTime.ParseExact(item.original, "dd/MM/yyyy HH:mm:ss:FFF", null);
else
dr[item.columnName.Substring(item.tableName.Length + 1)] = Convert.ChangeType(item.original, dt.Columns[item.columnName.Substring(item.tableName.Length + 1)].DataType);
}
}
}