Node.js 在循环中重复使用准备好的语句节点js mssql

Node.js 在循环中重复使用准备好的语句节点js mssql,node.js,typescript,node-mssql,Node.js,Typescript,Node Mssql,我正在做一个TS/NodeJS/MSSQL项目,我基本上想迭代一个数组,比如说产品,运行一个select查询来确定所述产品是否在数据库中,如果没有,则插入它 本练习的目的是为select和insert使用准备好的语句,并能够在迭代产品的循环中重用它们 假设我们有一个数组: 导出接口IPProduct{ 名称:字符串; 价格:数量; } 然后我们创建连接: const mssql=require(mssql); let connection=new mssql.ConnectionPool({

我正在做一个TS/NodeJS/MSSQL项目,我基本上想迭代一个数组,比如说产品,运行一个select查询来确定所述产品是否在数据库中,如果没有,则插入它

本练习的目的是为select和insert使用准备好的语句,并能够在迭代产品的循环中重用它们

假设我们有一个数组:

导出接口IPProduct{
名称:字符串;
价格:数量;
}
然后我们创建连接:

const mssql=require(mssql);
let connection=new mssql.ConnectionPool({
服务器:[服务器地址],
数据库:[数据库名称],
用户:[用户名],
密码:[密码]
});
然后是准备好的查询

let insertQuery=new mssql.PreparedStatement(连接);
insertQuery.input(“name”,mssql.TYPES.NVarChar);
insertQuery.input(“price”,mssql.TYPES.Float);
然后让我们迭代products数组:

异步迭代产品(产品:数组){ //如果查询未准备好,请首先准备查询 如果(!insertQuery.prepared) 等待insertQuery.prepare(“插入产品(名称、价格)值(@name、@price)”); products.forEach(异步(p)=>{ 让insertResult=wait insertQuery.execute(p); //插入后做什么 }); } //然后取消准备查询 wait insertQuery.unprepare(); 我经常犯的错误是

无法获取请求的连接。另一个请求正在进行中

我对这些东西真的很陌生,所以我很有可能完全忽略了一些明显的东西,或者以某种方式滥用了它

注意:代码是伪代码,只是描述问题。不要把它当作生产工作代码。所以,如果有一个点或逗号或任何遗漏或错误,它可能是好的

任何帮助都将不胜感激。
谢谢

我认为这是因为,但是我强烈建议不要做这种操作,尤其是在循环中。如果可能-尝试准备单个批处理,并使用SQL和在单个事务中处理此逻辑。这将更快,并应确保数据库状态一致。

我不确定我是否理解您的建议。使用SQL处理这种逻辑是什么意思?我考虑的是性能,这就是为什么我尝试使用准备好的查询。对不起,我不够清楚。您正在使用准备好的查询,这很好。但是,如果仔细观察,对于每个迭代,您有两个连续的数据库往返,一个用于检查是否存在,另一个用于插入数据。将该值乘以1000,您将有2000个数据库请求。这肯定会很慢。我想推荐的是尝试批量处理您的请求。创建一个临时表或表变量,将所有要使用的产品插入其中,然后在SQL中进行比较。这意味着您只有一个数据库往返来插入和比较,这更清楚。不幸的是,它没有解决我所面临的问题,特别是节点mssql。我的意思是,即使有更高性能的方法来实现同样的效果,我仍然在尝试如何重新使用节点MSSQL准备好的查询来帮助讨论,我更新了代码并删除了选择/查找部分。节点mssql的行为相同,即使它只是插入。