JavaScript Access 数据库 SQL 条件表达式中的数据类型不匹配

JavaScript Access Database SQL Data type mismatch in criteria expression

编辑:Answered/Workaround 在问题的底部。

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

我几乎是使用 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 中它给我错误 "Data type mismatch in criteria expression."

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

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

我将得到以下字符串:

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

这在 IE9 和 IE11 上工作得很好。一个解决方法是我什至在 hDate 输入上添加一个 "onchange",使用此触发器获取值并将其转换为添加年份的日期,将此新值传递给另一个输入,然后传递此主函数的新输入。我尽量避免这样做。

知道为什么 IE11 "seeing" 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 中正常工作。

感谢所有关注我的问题和试图帮助我的人。

[评估日期] 定义为 Date/Time 类型的字段?我希望 SQL 语句需要 # 日期分隔符而不是撇号,所以试一试。不知道为什么 IE9 接受撇号而 IE11 不接受 evDate 变量。

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

由于我在日期选择器中使用 moment.js 扩展程序,因此我决定尝试以下操作:

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

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