我正在尝试在我的项目中实现 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,它读取{"Data type mismatch in criteria expression."}。
任何人都可以就如何解决这个问题提供任何建议吗?
编辑:计划开始时间字段在计划表中定义为日期/时间。我需要将其所需的属性设置为 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:我已经按照 Abhishek 的(编辑 - 也是 Dean 的)建议通过如下修改 CSParameterCollection 类将 DateTime 转换为字符串来修复它。如果我决定使用不同的数据库,希望这不会导致问题,但它已为 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;
}
}