【问题标题】:Retrieve multiple result sets in sails js在sails js中检索多个结果集
【发布时间】:2018-03-13 06:45:07
【问题描述】:

我正在使用带有 sails-mssqlserver 适配器的sails js。问题在于,如果我的存储过程返回多个结果集,那么我只会收到一个最新的结果集。 相同的存储过程在 Java 上运行良好,我可以迭代相关的结果集。

我需要知道是否有一些特定的方法可以访问sails-mssqlserver 中的所有结果集?

【问题讨论】:

  • 能否复制适配器配置和模型方法调用?

标签: sql-server node.js sails.js multiple-resultsets sails-mssqlserver


【解决方案1】:

sails-mssqlserver 适配器是用于 Node.js 的官方 Microsoft SQL Server 客户端的包装器here,但它的依赖关系不在最新版本中。

选项 1: 根据 MsSQL 包的官方文档,您可以使用 request.multiple = true 命令在查询中启用多个记录集。

要在sails-mssqlserver 适配器中启用多个查询/记录集,一个骇人的解决方法是打开sails-mssqlserver/lib/adapter.js 并编辑原始查询函数。在 var request = new mssql.Request(mssqlConnect) 下面添加 request.multiple = true。如下例所示。

// Raw Query Interface
query: function (connection, collection, query, data, cb) {
  if (_.isFunction(data)) {
    if (debugging) {
      console.log('Data is function. A cb was passed back')
    }
    cb = data
    data = null
  }

  adapter.connectConnection(connection, function __FIND__ (err, uniqId) {
    if (err) {
      console.error('Error inside query __FIND__', err)
      return cb(err)
    }

    uniqId = uniqId || false
    var mssqlConnect
    if (!uniqId) {
      mssqlConnect = connections[connection].mssqlConnection
    } else {
      mssqlConnect = connections[connection].mssqlConnection[uniqId]
    }

    var request = new mssql.Request(mssqlConnect)

    // Add it here
    request.multiple = true

    request.query(query, function (err, recordset) {
      if (err) return cb(err)
      if (connections[connection] && !connections[connection].persistent) {
        mssqlConnect && mssqlConnect.close()
      }
      cb(null, recordset)
    })
  })
},

现在返回的记录集应该包含多个结果。

选项 2: 对于运行返回多个记录集的存储过程的用例,一个更可持续的选择是使用最新版本的 Node.js 官方 Microsoft SQL Server 客户端。有关运行存储过程的信息,请参阅here

首先安装最新的包:

npm install mssql --save

在您要运行存储过程的代码中,添加到 mssql 数据库的连接:

// require the mssql package
const sql = require('mssql')

// make a connection, you can use the values you have already stored in your adapter
const pool = new sql.ConnectionPool({
    user: sails.config.connections.<yourMsSQLConnection>.user,
    password: sails.config.connections.<yourMsSQLConnection>.password,
    server: sails.config.connections.<yourMsSQLConnection>.server,
    database: sails.config.connections.<yourMsSQLConnection>.database
})

// connect the pool and test for error 
pool.connect(err => {
    // ...
})

// run the stored procedure using request
const request = new sql.Request()
request.execute('procedure_name', (err, result) => {
    // ... error checks 
    console.log(result.recordsets.length) // count of recordsets returned by the procedure
    console.log(result.recordsets[0].length) // count of rows contained in first recordset
    console.log(result.recordset) // first recordset from result.recordsets
    console.log(result.returnValue) // procedure return value
    console.log(result.output) // key/value collection of output values
    console.log(result.rowsAffected) // array of numbers, each number represents the number of rows affected by executed statemens 
    // ...
})

// you can close the pool using
pool.close()

如果sails-* 数据库适配器不包含您需要的所有功能。我发现最好创建一个包含附加功能的sails Service。这是一个非常干净的解决方案。

【讨论】:

  • 您的回答在问题的上下文中似乎令人满意。但我想在某一点更正。据我所知request.multiple = true 将在单个查询字符串中启用多个查询执行。因此,这将返回多个记录集。在我的例子中,存储过程返回了多个记录集。所以request.multiple = true 不会对我通过存储过程返回的多个结果集产生任何影响。例如,const request = new sql.Request(); request.multiple = true; request.query('select 1 as number; select 2 as number', (err, result) =&gt; { });
  • 我认为覆盖适配器代码会导致 1.最新版本支持问题。 2.部署问题。我更喜欢Model类中的覆盖方法而不是在节点模块中进行更改。
  • 更多内容仅供您参考。 npm mssql 根据文档。 request.multiple 支持已从最新版本的模块中删除。
  • @JankiGadhiya 我同意,破解适配器代码从来都不是理想的解决方案。关于删除 request.multiple 的支持,sails -mssqladapter 不依赖于最新版本,它依赖于“mssql”:“^3.3.0”。好消息是用于 Node.js 的官方 Microsoft SQL Server 客户端的最新版本支持您正在寻找的开箱即用的东西。它现在返回结果而不是返回记录集,当查询响应多个记录集时,它将包含单个记录集的记录集或记录集。我将更新我的答案以反映这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
  • 2010-12-13
相关资源
最近更新 更多