Получить несколько наборов результатов в парусах js

Я использую паруса js с адаптером sails-mssqlserver. Проблема в том, что если моя хранимая процедура возвращает несколько наборов результатов, я получаю только один результирующий набор, который является последним из всех. Эта же хранимая процедура отлично работает с Java, и я получаю итерацию по соответствующим наборам результатов.

Мне нужно знать, есть ли какой-либо конкретный способ доступа ко всем наборам результатов в sails-mssqlserver?

Ответ 1

Адаптер sails-mssqlserver является оберткой официального клиента Microsoft SQL Server для Node.js здесь, однако его зависимость а не в последней версии.

Вариант 1: Согласно официальной документации пакета MsSQL, вы можете включить несколько наборов записей в запросах с помощью команды request.multiple = true.

Чтобы включить несколько запросов/наборов записей в адаптере sails-mssqlserver, хакерское обходное решение - открыть sails-mssqlserver/lib/adapter.js и отредактировать функцию необработанных запросов. Добавление request.multiple = true ниже var request = new mssql.Request(mssqlConnect). Как показано в примере ниже.

// 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: Более устойчивым вариантом для использования в случаях, когда выполняется хранимая процедура, которая возвращает несколько наборов записей, является использование последней версии официального клиента Microsoft SQL Server для Node.js. Информация о запущенных хранимых процедурах доступна здесь

Сначала установите последний пакет:

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- * не содержит всех необходимых вам функций. Я считаю, что лучше создать паруса Сервис, который обертывает дополнительные функции. Это действительно чистое решение.