我正在尝试在我的项目中实现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}
此外,正在使用的数据库是访问。引发的错误是OldDbException,它读取 {“条件表达式中的数据类型不匹配。”} 。
有人可以就如何解决这个问题提出任何建议吗?
编辑: Schedule StartTime字段在Schedule表中定义为Date / Time。我需要它将其所需的propetry设置为True,但已禁用以便通过将StartTime保留为out来测试添加记录。这些参数通过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;
}
}
答案 0 :(得分:2)
我强烈认为问题是因为将参数添加到参数集时参数的顺序不同。
确保它们的顺序相同,这适用于sql语句或存储过程。
ADO.NET在使用OLEDB提供程序时不支持命名参数,并且由于您连接到Access DB,因此实际上使用的是OLEDB提供程序。所以参数的顺序很重要。
如果它们处于有序状态并且仍然无法正常工作,那么我认为它可能是DateTime的一个问题。在将其添加为参数之前,请尝试将其转换为字符串。