【问题标题】:JavaScript Access Database SQL Data type mismatch in criteria expressionJavaScript 访问数据库 SQL 条件表达式中的数据类型不匹配
【发布时间】:2017-04-14 20:20:51
【问题描述】:

编辑:问题底部的已回答/解决方法。

我已经看到了关于这个错误的所有其他问题,但我非常肯定这是一个独特的场景。

我几乎正在使用 JavaScript 从一个自建网站管理一个 Access 数据库,但我遇到了以下问题:

var evDate = new Date(hDate);
evDate.setFullYear(evDate.getFullYear() + 1);
evDate = evDate.toLocaleDateString().toString();
var SQL = "INSERT INTO PendingChanges([Eval Date]) VALUES ('" + evDate + "')";

这提供了以下字符串:

"INSERT INTO PendingChanges([Eval Date]) VALUES ('‎04‎/‎19‎/‎2018')"

在 IE9 中这工作正常,但在 IE11 中它给了我错误“标准表达式中的数据类型不匹配。”

如果我改用 hDate 值,它来自带有日期选择器的输入,而不添加年份:

var SQL = "INSERT INTO PendingChanges([Eval Date]) VALUES ('" + hDate + "')";

我将得到以下字符串:

"INSERT INTO PendingChanges([Eval Date]) VALUES ('‎04‎/‎19‎/‎2017')"

这在 IE9 和 IE11 上运行良好。一种解决方法是我什至在 hDate 输入上添加“onchange”,使用此触发器获取值并将其转换为添加了年份的日期,将这个新值传递给另一个输入,然后传递这个新输入到主要功能。我试图避免这样做。

任何想法为什么 IE11 没有“看到” evDate 上的字符串值是有效的? (相信我,它看起来与 hDate 相同,唯一的区别是 2017/2018)。

编辑:这就是我使用 SQL 变量对数据库进行查询的方式。

var pad = "Access Database File Path";
var cn = new ActiveXObject("ADODB.Connection");
var strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pad;
cn.Open(strConn);
var rs = new ActiveXObject("ADODB.Recordset");
rs.Open(SQL, cn);
//if i close the rs after the rs.Open, the function returns an error that the change can not be completed on a closed connection, so i just close the connection.
cn.Close();

编辑 2:回答

我找到了一个更简单的解决方法。我没有使用 3 行代码用 hDate 创建日期,而是添加一年并将其更改为短日期字符串,我使用了 moment.js

var evDate = moment(hDate).add(1, 'year').format('MM/DD/YYYY');

这返回的值与我之前使用的相同,但它允许该函数在 IE9 和 IE11 中都能正常工作。

感谢所有关注我的问题的人以及那些试图帮助我的人。

【问题讨论】:

  • 您如何使用SQL 变量?
  • 不要尝试将代码放在问题中,编辑问题以澄清。
  • 我已经用代码编辑了问题。谢谢。

标签: javascript ms-access internet-explorer-9 internet-explorer-11


【解决方案1】:

[Eval Date] 定义为日期/时间类型字段?我希望 SQL 语句需要 # delimiter 作为日期而不是撇号,所以试一试。不知道为什么 IE9 接受撇号而 IE11 不接受 evDate 变量。

【讨论】:

  • 是的,它被定义为日期/时间。磅唱根本不起作用,我必须使用撇号。我在表格上有 3 个日期字段,并且我提供带有撇号的日期值。我通过发送带有每个字段值及其各自值的插入语句来“调试”它,直到我发现 IE11 上没有采用“更新”日期。我还在单独的测试中将更新的日期发送到其他 2 个字段,它们也出错了。正如我在问题帖子中提到的,如果我只是发送正常的日期字符串(hDate)而不将其转换为一年后,它就可以正常工作。
【解决方案2】:

不完全是答案,更像是一种解决方法。

由于我为我的日期选择器使用了 moment.js 扩展,我决定尝试以下方法:

var evDate = moment(hDate).add(1, 'year').format('MM/DD/YYYY');

这最终提供了与我之前的方法相同的值,但由于某些随机的独特原因,它在 IE9 和 IE11 中都可以正常工作。我的猜测是,IE11 上的 evDate.toLocaleDateString().toString() 出于某种原因不能很好地使用 javascript,而 javascript 也没有将其作为字符串。只是我的随机猜测。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2017-01-14
    • 1970-01-01
    • 2016-01-18
    相关资源
    最近更新 更多