簡體   English   中英

使用Node.js和Tedious插入多個記錄

[英]Inserting more than one record with Node.js and Tedious

我有一組客戶對象,我希望將其插入到SQL數據庫中。 從req數據中檢索客戶對象。

我正在使用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).]`

請注意,此時我只在req中發送了3個對象。 在我看來,它只是被處理和插入的最后一個對象。 但由於我不熟悉使用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);
        });
    }
});

變量countfirstName的范圍是全局的。 pool.acquire(函數get執行for循環已經完成並且它正在插入最后一個客戶兩次。一個可能的解決方案是將一個匿名函數放在for循環中,例如(盡管它不必是匿名的) )

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM