在循环中重复使用准备好的语句node-js mssql

我正在研究 TS / NodeJS / MSSQL 项目,基本上我想对一组东西(例如产品)进行迭代,运行选择查询以确定该产品是否在数据库中,以及如果没有插入。

本练习的目的是为选择,插入和在循环迭代产品的循环中重用它们使用准备好的语句。

所以说我们有这个数组:

export interface IProduct{
 name:string;
 price:number;
}

然后我们创建连接:

const mssql = require(mssql);
let connection = new mssql.ConnectionPool({
 server:[server address],database:[database name],user:[username],password:[password]
});

然后准备查询

let insertQuery = new msssql.PreparedStatement(connection);
insertQuery.input("name",mssql.TYPES.NVarChar);
insertQuery.input("price",mssql.TYPES.Float);

然后让我们迭代products数组:

async iterateProducts(products:Array<IProduct>){
//first prepare the query if it's not prepared
if(!insertQuery.prepared)
  await insertQuery.prepare("INSERT INTO Products (name,price) values (@name,@price)");

products.forEach(async (p)=>{
    let insertResult = await insertQuery.execute(p);
    //do anything after insert
  });
}
//then unprepare query
await insertQuery.unprepare();

我一直遇到的错误是

Can't acquire connection for the request. There is another request in progress

我真的很陌生,所以很有可能我完全错过了明显的东西或以某种方式滥用了它。

注意:代码是伪代码,仅用于描述问题。不要将其作为生产工作代码。因此,如果有一个点或逗号或任何丢失或错误的东西,那可能没问题。

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

fangchengkuan 回答:在循环中重复使用准备好的语句node-js mssql

我认为这是由于MARS而引起的,但是我强烈建议您不要进行此类操作,尤其是在循环中。如果可能-尝试准备一个批处理,并使用SQL在单个事务中处理此逻辑。这样会更快,并且应确保数据库状态一致。

本文链接:https://www.f2er.com/2891150.html

大家都在问