【发布时间】:2021-05-17 01:55:27
【问题描述】:
我目前正在为我的叔叔做一个项目,他是一名兽医。这是一个电子项目,让他可以管理他的客户、病人和他们的访问。然而,在使用一段时间后,我们意识到,有时 ipcRenderer 在尝试插入新客户、患者或约会时会触发两次,甚至更多次。我试图通过添加另一个 sql 查询来捕获这一点,该查询检查是否有相同的记录,我想要插入的内容已经在数据库中。但是现在,每当我尝试插入新记录时, db.all() (起初是 db.run() ,在过去的几个小时里,我一直在尝试通过反复试验来修复并且绝望了)哪个插入记录在 db.all() 之前执行,它获取相同记录的数量并设置计数器,尽管它应该在之后执行。我尝试使用 $.when() 和 .done() 来解决这个问题,但是遇到了无法检查计数器是否为 0 的问题,因为 .done() 需要一个函数,而 .done(如果) 不起作用。顺便说一句,我更像是一个 C++、java、C# 的家伙,并且对 jQuery、JS 和其他东西不太熟悉,如果我的错误是微不足道的,那么抱歉。 这是代码,你可以忽略这些长的 SQL 语句,我知道,它们不符合编码约定,但它们有效:
$("#btn-ins-patient").on("click", function() {
ipcRenderer.once('insert-patient', function(event, arg) {
let checksql = "select count(*) as 'zaehl' from patient where "
+ "owner = " + arg.owner + " and name = '" + arg.name + "' and species = '" + arg.species + "' and breed = '" + arg.breed + "' and sex = '" + arg.sex + "' and neutered = '" + arg.neutered + "' and dead = '" + arg.dead + "' and chipnr = '" + arg.chipnr + "' and birthdate = '" + arg.birthdate + "' and color = '" + arg.color + "';"
db.all(checksql, function(error, rows) {
if (error) {
console.log(error.code, checksql)
insertpatsql = "select * from patient where id = 1;";
}
else{
console.log(checksql); //second output in console, prints the right statement
for (let i = 0; i < rows.length; i++) {
var counter = rows[i].zaehl;
console.log(counter); //third output in console, prints 0
setCount(counter);
console.log(cnter); //fourth output in console, prints 0 again
}
if(cnter != 0){
insertpatsql = "select * from patient where id = 1;";
console.log(insertpatsql);
console.log("double entry was stopped");
}
else{
console.log(insertpatsql); // fifth output in console prints the right statement (insert)
}
}
});
let insertpatsql = "insert into patient"
+ "(owner, name, species, breed, sex, neutered, dead, chipnr, birthdate, color, notes, diverse)"
+ "values ('" + arg.owner + "', '" + arg.name + "', '" + arg.species + "', '" + arg.breed + "', '" + arg.sex + "', '" + arg.neutered + "', '" + arg.dead + "', '" + arg.chipnr + "', '" + arg.birthdate + "', '" + arg.color + "', '" + arg.notes + "', '" + arg.diverse + "');";
if(cnter == 0){
db.all(insertpatsql, function(error) {
if (error) {
console.log(error.code, insertpatsql)
}
else{
console.log(insertpatsql);
loadPatients();
}
});
}
else{
console.log("double entry was tried", insertpatsql, cnter);
//first output in console, cnter is undefined
}
})
let child = new BrowserWindow({
height: 485,
width: 795,
parent: parent,
modal: true,
resizable: false,
show: false,
webPreferences: {
nodeIntegration: true
}
})
child.loadFile('./ins/patient.html')
child.once('ready-to-show', () => {
child.show()
})
child.on('closed', () => {
child = null
})
})
select * from patient where id = 1; 只是出于安全原因,因为有时会执行第二个 db.all(),即使它不应该执行。我知道我的代码很乱,对不起,我整天都在努力解决这个问题......
这就是我设置 cnter(全局变量)的方式:
var cnter;
function setCount(cnt){
cnter = cnt;
}
如何确保 checksql 及其代码块在插入之前执行?
【问题讨论】:
-
你的意思是第一个请求没有完成,第二个请求开始了?
-
基本上是的。我不明白这是如何或为什么会发生的。第一个 db.all() 和 if(cnter == 0) 必须几乎同时启动。为什么在开始另一个块之前它不能在第一个块中全部工作?还是一开始就开始第二个?
-
db.all 不是异步的?
标签: javascript jquery sqlite electron