プロジェクトにCoolStorageを実装しようとしていますが、日付パラメーターを使用すると問題が発生します。日付パラメーターとしてnullを渡すと、レコードが正常に追加されますが、実際の日付を渡すと、.Save()を呼び出して新しいレコードをデータベースに書き込むときにエラーが発生します。(Activa)CoolStorageソースコードを入手し、失敗するポイントを見つけましたが、修正方法がわかりません。
失敗するコードは次のとおりです(具体的にdbCommand.ExecuteNonQuery()
は行)。
internal int ExecuteNonQuery(string sqlQuery, CSParameterCollection parameters)
{
long logId = Log(sqlQuery, parameters);
IDbCommand dbCommand = CreateCommand(sqlQuery, parameters);
try
{
dbCommand.ExecuteNonQuery();
return 1;
}
catch (InvalidOperationException)
{
return -1;
}
finally
{
LogEnd(logId);
}
}
sqlQueryには次のものが含まれます。
insert into [Schedule] ([TaskID],[StartTime],[MondayYn],[TuesdayYn],[WednesdayYn],[ThursdayYn],[FridayYn],[SaturdayYn],[SundayYn],[DefaultSysuserID],[DefaultTeamID],[ActiveYn])
values (@P17,@P18,@P19,@P20,@P21,@P22,@P23,@P24,@P25,@P26,@P27,@P28)
@ P18には、問題のある日付が含まれています。これは、値が次のCSParameterオブジェクトです。
{17/12/2012 18:52:44}
また、使用されているデータベースはAccessです。スローされるエラーは、 {"条件式のデータ型の不一致"}を読み取るOldDbExceptionです。
誰かがこれを解決する方法について何かアドバイスを提供できますか?
編集: Schedule StartTimeフィールドは、ScheduleテーブルでDate/Timeとして定義されています。必要なプロパティをTrueに設定する必要がありますが、StartTimeを省略してレコードの追加をテストするために、無効にしています。パラメータは、CoolStorageクラスを介して次のように適用されます。
Schedule schedule = Schedule.New();
schedule.TaskID = task.TaskID;
schedule.StartTime = DateTime.Now;
schedule.MondayYn = true;
schedule.TuesdayYn = true;
schedule.WednesdayYn = true;
schedule.ThursdayYn = true;
schedule.FridayYn = true;
schedule.SaturdayYn = false;
schedule.SundayYn = false;
schedule.DefaultSysuserID = sysuser.SysuserID;
schedule.DefaultTeamID = sysuser.SysuserTeams.First().TeamID;
schedule.ActiveYn = true;
schedule.Save();
Schedule.StartTime = DateTime.Now行をコメントアウトすると、レコードを正常に追加できます。そうしないと、上記のエラーが発生します。ORMマッピングクラスを編集せずにフォーマットをテキストに変更することはできません。これにより、他の場所でエラーが発生することは間違いありません。CoolStorage DataProviderクラスを変更できると思いますが、これは必要ないと思いますか?
EDIT2:テストとして、上記のSQLをインターセプトして、@ P18参照を削除し、その場所に日付をハードコーディングして、レコードを正しく追加しました。
insert into [Schedule] ([TaskID],[StartTime],[MondayYn],[TuesdayYn],[WednesdayYn],[ThursdayYn],[FridayYn],[SaturdayYn],[SundayYn],[DefaultSysuserID],[DefaultTeamID],[ActiveYn])
values (@P17,#2012-12-01 12:00:00#,@P19,@P20,@P21,@P22,@P23,@P24,@P25,@P26,@P27,@P28)
また、パラメーターの値を#yyyy-MM-dd hh:mm:ss#の形式の文字列としてキャストして変更しようとしましたが、基準式エラーでデータ型の不一致が発生しました。
EDIT3: CSParameterCollectionクラスを次のように修正して、DateTimeを文字列に変換するというAbhishek(edit-Dean)の提案に従って修正しました。別のデータベースを使用することにした場合、これで問題が発生しないことを願っていますが、Access用に修正されています。
public CSParameter this[string name]
{
get
{
CSParameter parameter;
_parameterMap.TryGetValue(name, out parameter);
if (parameter.Value.GetType().Equals(typeof(DateTime)))
{
DateTime date = (DateTime)parameter.Value;
string dateString = date.ToString("yyyy-MM-dd hh:mm:ss");
parameter.Value = dateString;
}
return parameter;
}
}