多个记录添加到数据库

时间:2017-11-14 14:40:40

标签: javascript node.js ms-access adodb

我对一个奇怪的问题感到困惑,我无法复制。

方案

我写了一个简单的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天后,我注意到连续三次加入。

问题

  1. 你看到我的方法有任何重大错误的证据吗?
  2. 有没有更可靠的方法来避免这个问题?
  3. 请注意我无法更改数据库结构,因为它不是我的。

    更新

    这是我使用的新代码:

    // 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一次只执行一个查询?

0 个答案:

没有答案