我正在使用Node.js将一些数据发送到SQL Server表。代码有一个for循环,它调用一个函数,它运行一个insert语句(最终将是一个存储过程)。 foor循环按日期顺序运行一系列对象。大多数情况下,insert语句以正确的顺序完成,但某些条目的顺序错误。
是否有某种方法可以确保数据库中日期的顺序与我调用它们的顺序相同(按时间顺序排列)。我知道T-SQL中的SORT
,但我认为程序应该以正确的顺序执行。我总是听说尽可能避免线程睡眠和计时器,所以我不喜欢setTimeout
的想法。有没有其他方式,也许有事件处理?
以下示例代码。 jsonArray
的元素是一个具有日期键和其他几个数字的对象。 SQL Server表有一个自动递增的主键整数,我希望按时间顺序输入日期(就像我调用它们),这样主键和日期都是有序的。
我也使用MSSQL
导入进行SQL操作。
// Main class
for (let j = 0; j < jsonArray.length; j++) {
let myObj = jsonArray[j]
WriteToDB.myWriteFunction(myObj)
}
// Different class
const sql = require('mssql')
let request = new sql.Request()
let query = (...)
function myWriteFunction () {
request.query(query) // Just the actual insert statement, no issue here
request.on('error', function (err) {
console.log('REQ ERROR')
console.dir(err)
})
// These dates are out of order, due to when the done event is triggered
request.on('done', function () {
console.log('QUERY RAN FOR ' + e1)
})
}
答案 0 :(得分:1)
我正在假设某种导致这种情况的多线程
这些数据库操作是异步完成的,它们都发生在同一个线程上。如果D1(第一个数据库操作)花费的时间长于D2(第二个数据库操作)并且在D2之后插入D1(导致问题),则不是涉及多线程的问题,可能D2有更多数据等。
我完全建议你不要使用波纹管代码示例,除非你真的相信sql中的顺序确实很重要。 req2仅在req1完成后完成,依此类推。=&gt;浪费时间
let jsonArray = [1,2,3,4];
if (checkArray(jsonArray)) {
createReq(jsonArray[0])
}
function createReq(req) {
new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
jsonArray.shift();
console.log(req);
if (checkArray(jsonArray)) {
createReq(jsonArray[0])
}
}, 100)
})
}
function checkArray(arr) {
return (jsonArray && jsonArray[0])
}