【问题标题】:node-mssql insert returning undefined recordsetnode-mssql 插入返回未定义的记录集
【发布时间】:2020-11-29 03:08:32
【问题描述】:

Select 语句工作正常,但每当我尝试插入或更新记录集时,受影响的值都未​​定义。插入/更新在数据库中工作,我只是无法读取返回值。

var sql = require('mssql');
var config = {...};

sql.connect(config).then(function() {
  new sql.Request().query("INSERT INTO MyTable (Name, Age) VALUES ('John', 30)").then(function(recordset, affected) {
    console.log('Recordset: ' + recordset);
    console.log('Affected: ' + affected);
  }).catch(function(err) {
    console.log('Request error: ' + err);
  });
}).catch(function(err) {
  if (err) {
    console.log('SQL Connection Error: ' + err);
  }
});

控制台的输出是:

Recordset: undefined
Affected: undefined

我觉得我必须在这里遗漏一些非常简单的东西。

【问题讨论】:

  • 我对 js 一无所知,但是:INSERT 语句不返回记录集。也许这对您的问题有所启发?
  • 也许您需要将 OUTPUT 子句添加到您的 INSERT 命令中。

标签: javascript sql-server node.js node-mssql


【解决方案1】:

如 cmets 中所述,INSERT 语句不返回记录集,因此 recordset 未定义。请参阅文档的this section,了解有关如何获取受影响行数的更多信息。

您的代码的问题是您期望 affected 作为 Promise 的第二个参数,但 Promise 只支持一个参数。因此,您必须以这种方式访问​​受影响的行数:

var sql = require('mssql');
var config = {...};

sql.connect(config).then(function() {
  var request = new sql.Request();
  request.query("INSERT INTO MyTable (Name, Age) VALUES ('John', 30)").then(function(recordset) {
    console.log('Recordset: ' + recordset);
    console.log('Affected: ' + request.rowsAffected);
  }).catch(function(err) {
    console.log('Request error: ' + err);
  });
}).catch(function(err) {
  if (err) {
    console.log('SQL Connection Error: ' + err);
  }
});

【讨论】:

  • 感谢您的回复!这是有道理的,但我想我最终想要的是新插入行中 ID 列的值。获得它的最佳方法是什么?
  • 将您的 TSQL 命令更改为:INSERT INTO MyTable (Name, Age) VALUES ('John', 30);SELECT @@IDENTITY AS ID
  • 使用SCOPE_IDENTITY() 可能比使用@@IDENTITY 更好。如果同时发生许多INSERT INTO@@IDENTITY 会遇到竞争条件吗?
【解决方案2】:

如果你想 id 作为输出参数

const sql = require("mssql/msnodesqlv8");
const pool = new sql.ConnectionPool(dbConfig);`
const poolConnect = pool.connect();    
let query = `INSERT INTO <table>(fields) VALUES(values);SELECT @id = SCOPE_IDENTITY()`
await poolConnect;
pool.request()
    .output("id", sql.Int)
    .query(query).then((err, result) => {
        console.log(result.output.id)
    }).catch(err => {
        console.log(err)
    })`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2016-04-05
    相关资源
    最近更新 更多