Javascript 将多个记录添加到数据库中
我对一个我无法复制的奇怪问题感到困惑 脚本 我编写了一个简单的Javascript 将多个记录添加到数据库中,javascript,node.js,ms-access,adodb,Javascript,Node.js,Ms Access,Adodb,我对一个我无法复制的奇怪问题感到困惑 脚本 我编写了一个简单的nodejs应用程序,在一些UI交互之后,将一些记录附加到access97数据库中。我正在使用节点adodb连接它 一些相关的代码 var DBDATA = require('node-adodb'), dbConnection = DBDATA.open('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=/path/to/my/file.mdb'); function append(dat
nodejs
应用程序,在一些UI交互之后,将一些记录附加到access97数据库中。我正在使用节点adodb
连接它
一些相关的代码
var DBDATA = require('node-adodb'), dbConnection = DBDATA.open('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=/path/to/my/file.mdb');
function append(data, callback)
{
var table;
var query;
var array = [];
array.push({name: "Date", value: formatDate(data.date)});
array.push({name: "Time", value: formatTime(data.date)});
array.push({name: "Type", value: Number(data.Type)});
array.push({name: "Value", value: Number(exists(data.value, 0))});
// ...other fields
var fields = array.map(function (e) {
return "[" + e.name + "]";
}).join(",");
var values = array.map(function (e) {
return e.value;
}).join(",");
table = "tblData";
query = 'INSERT INTO ' + table + '(' + fields + ') ' + 'VALUES (' + values + ')';
dbConnection
.execute(query)
.on('done', function (data) {
return callback({id: id, success: true});
})
.on('fail', function (data) {
console.log(data);
return callback({id: id, success: false});
});
}
问题
每当新记录准备就绪时,就会调用上述函数。通常它工作正常,但每周发生一次(在数百条记录中),我在数据库中发现多行相同
由于信息的性质,这是不可能的——我的意思是,实际数据不可能是相同的
我猜测调用者中有一个bug,出于某些原因,它会向我发送相同变量的内容。因此,我在追加记录之前添加了一个检查
我想做什么
在append
函数中,我调用这个函数,如果它返回值>0,我就不执行查询,因为这意味着已经存在相同的行
用假数据测试得到了很好的结果:没有添加多个记录。
不幸的是,这并没有解决现实世界中的问题。20天后,我注意到一行被添加了三次
问题
// Add only if there isn't an identical record
query = 'INSERT INTO ' + table + '(' + fields + ') ';
query += ' SELECT TOP 1 ' + values;
query += ' FROM ' + table;
query += ' WHERE NOT EXISTS ( SELECT 1 FROM ' + table + ' WHERE ';
array.forEach(function(element)
{
query += "([" + element.name + "]=" + element.value + ") AND ";
});
query = query.substr(0, query.length - 4);
query += ' );';
dbConnection
.execute(query)
.on('done', function (data) {
return callback({id: id, success: true});
})
.on('fail', function (data) {
console.log(data);
return callback({id: id, success: false});
});
但这并没有解决问题,也就是说,有时我仍然在数据库中找到两个或多个相同的记录
我担心这可能是相同的行为:客户端在一段时间内发出多个请求,它们并行执行,因此每个请求都找不到记录,所有请求都将被添加
汉斯,在不改变数据库结构的情况下,避免这种情况的正确方法是什么?
有没有办法强制
节点adodb
一次只执行一个查询?Javascript并行工作(异步)。这意味着,它将在几乎相同的时间跨度内请求数据3次。然后,它将插入数据。这意味着它三次返回0
,然后存储三次数据。是否可以强制该函数同步工作?或者还有什么其他工具可以避免这个问题?即使在sql@Maxim像这样的@标记是,但ms access可能有一些不同的语法
// Add only if there isn't an identical record
query = 'INSERT INTO ' + table + '(' + fields + ') ';
query += ' SELECT TOP 1 ' + values;
query += ' FROM ' + table;
query += ' WHERE NOT EXISTS ( SELECT 1 FROM ' + table + ' WHERE ';
array.forEach(function(element)
{
query += "([" + element.name + "]=" + element.value + ") AND ";
});
query = query.substr(0, query.length - 4);
query += ' );';
dbConnection
.execute(query)
.on('done', function (data) {
return callback({id: id, success: true});
})
.on('fail', function (data) {
console.log(data);
return callback({id: id, success: false});
});