我对一个奇怪的问题感到困惑,我无法复制。
我写了一个简单的nodejs
应用程序,在一些UI交互之后将一些记录附加到Access 97数据库。我使用node-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});
});
}
只要新记录准备就绪,就会调用上述函数。通常它工作正常,但它每周大约发生一次(在数百条记录中),我在数据库中发现多行相同。
由于信息的性质,这是不可能的 - 我的意思是,实际数据是不可能的。
我猜错了调用者的错误,由于某些原因,我发送了相同的变量内容。因此我在追加记录之前添加了一张支票。
function checkDuplicate(table, array, callback)
{
var query = "SELECT * FROM " + table + " WHERE ";
array.forEach(function(element)
{
query += "([" + element.name + "]=" + element.value + ") AND ";
});
query = query.substr(0, query.length - 4);
dbConnection
.query(query)
.on("done", function (data) {
return callback(data.records.length > 0);
})
.on("fail", function (data) {
return callback(false);
});
}
在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});
});
但它并没有解决问题,即有时我仍然在数据库中找到两条或更多条相同的记录。
我担心这可能是同样的行为:客户端会在一段时间内发出多个请求并且它们是并行执行的,因此每个人都找不到记录,所有人都会添加它。
Hance,正确的方法是什么,以避免这种没有更改数据库结构?
有没有办法强制node-adodb
一次只执行一个查询?