2015-11-16 98 views
1

我有一個客戶對象數組,我希望將其插入到SQL數據庫中。 客戶對象從請求數據中檢索。用Node.js和Tedious插入多條記錄

我正在使用Tedious進行請求,並且Tedious Connectionpool爲了同時有多個連接。

當遍歷對象試圖插入,當我得到一個錯誤,該錯誤是

{ [RequestError: Violation of PRIMARY KEY constraint `'PK__Customer__A4AE64D873A5400C'. Cannot insert duplicate key in object 'dbo.Customer'. The duplicate key value is (2).]` 

請注意,我只有3個對象,此時在REQ被髮送。它在我看來,它只是正在處理和插入的最後一個對象。但是因爲我對使用Node.js乏味,我不能發現我的錯誤。有什麼建議麼 ?

router.post('/',jsonParser, function(req, res) { 


var customers = req.body.customers; 
var companies = req.body.companies; 

var Connection = require('tedious').Connection; 
var Request = require('tedious').Request; 
var TYPES = require('tedious').TYPES; 
var config = { 
    userName: '*************', 
    password: '*************', 
    server: '***********.database.windows.net', 
    // When you connect to Azure SQL Database, you need these next options. 
    options: {encrypt: true, database: '*******'} 
}; 

var poolConfig = { 
    min: 1, 
    max: 3, 
    log: true 
}; 

var pool = new ConnectionPool(poolConfig, config); 

    for (var i = 0; i < customers.length; i++) { 

     console.log('Inserting '+customers[i].firstname); 
     var firstname = customers[i].firstname; 
     var count = i; 


     pool.acquire(function (err, connection) { 
      if (err) 
       console.error(err); 



      //use the connection as normal 
      var request = new Request("INSERT INTO dbo.Customer" + 
       " (Firstname,CustomerId)" + 
       "VALUES" + 
       " (@Firstname,@CustomerId);", function (err, rowCount) { 
       if (err) 
        console.error(err); 

       console.log('rowCount: ' + rowCount); 


       //release the connection back to the pool when finished 
       connection.release(); 
      }); 

      request.addParameter('Firstname', TYPES.VarChar,firstname); 
      request.addParameter('CustomerId', TYPES.Int, count); 


      request.on('row', function (columns) { 
       console.log('value: ' + columns[0].value); 
      }); 

      connection.execSql(request); 
     }); 

     pool.on('error', function (err) { 
      console.error(err); 
     }); 
    } 
}); 

回答

2

變量countfirstName的範圍是全局的。在執行pool.acquire(函數時,for循環已完成,它將插入最後一個客戶兩次。一種可能的解決方案是在for循環中放置一個匿名函數,例如(雖然不一定是匿名)

for (var i = 0; i < customers.length; i++) { 
    (function(count, firstName) { 
     ...do insert here... 
    }(i, customers[i].firstname)); 
}