使用日期参数时的“数据类型不匹配”

Posted

技术标签:

【中文标题】使用日期参数时的“数据类型不匹配”【英文标题】:"Data type mismatch" when using date Parameters 【发布时间】:2012-12-17 19:12:26 【问题描述】:

我正在尝试在我的项目中实现 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.".

任何人都可以就如何解决这个问题提供任何建议吗?

编辑: 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# 的字符串来修改参数的值,但是我仍然收到 Data type mismatch in criteria expression 错误。

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;
    

【问题讨论】:

您是否尝试过将日期转换为格式为“yyyy-mm-dd hh:MM:ss”的字符串并将其用作参数值? “值为” - 那是DateTime吗? string?还是...? StartTime在数据库中是如何定义的?以及如何分配@P18 参数? 您确定错误是由您显示的语句引起的吗?无论如何,查看 [Schedule] 表的表定义会很有帮助 感谢您的回复,请查看我的编辑 【参考方案1】:

我强烈感觉到问题是因为在将它们添加到参数集合时,参数的顺序不同。

确保它们的顺序相同,这适用于 sql 语句或存储过程。

在使用 OLEDB 提供程序时,ADO.NET 不支持命名参数,并且由于您要连接到 Access DB,因此您实际上是在使用 OLEDB 提供程序。所以参数的顺序很重要。

如果它们正常但仍然无法正常工作,那么我认为这可能是 DateTime 的问题。在将其添加为参数之前尝试将其转换为字符串。

【讨论】:

感谢您的建议,但是正如您从我的编辑中看到的那样,我没有指定顺序,CoolStorage 正在为我做这件事,而且它肯定是正确的。此外,当我没有为 StartDate 设置任何值,因此没有参数时,它会添加记录罚款 我刚刚尝试了您的第二个建议,将其转换为格式为 yyyy-MM-dd hh:mm:ss 的字符串,现在我可以添加记录了。非常感谢您的帮助!

以上是关于使用日期参数时的“数据类型不匹配”的主要内容,如果未能解决你的问题,请参考以下文章

需要为日期允许 Null 或“”值 - 访问查询数据类型不匹配

“条件表达式中的数据类型不匹配”错误将日期插入 Access 数据库中的日期/时间字段

使用 Decimal 参数的数据类型不匹配 - OleDb、C#、Access

将日期时间插入数据库

解决elementui日期时间选择器提交时与后台date类型不匹配问题

条件表达式 Excel 2007 中的数据类型不匹配