Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将多个记录添加到数据库中_Javascript_Node.js_Ms Access_Adodb - Fatal编程技术网

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});
          });