在 sails js 中检索多个结果集
Retrieve multiple result sets in sails js
我正在使用 sails js sails-mssqlserver 适配器。它的问题是,如果我的存储过程 returns 多个结果集,那么我只会收到一个最新的结果集。
相同的存储过程在 Java 上运行良好,我开始迭代相关的结果集。
我想知道是否有一些特定的方法可以访问 sails-mssqlserver 中的所有结果集?
sails-mssqlserver 适配器是官方 Microsoft SQL 服务器客户端的包装器 Node.js 可用 here 但它的依赖性不在最新版本中。
选项 1:
根据 MsSQL 包的官方文档,您可以使用 request.multiple = true 命令在查询中启用多个记录集。
要在 sails-mssqlserver 适配器中启用多个 queries/recordsets,一个 hackish 解决方法是打开 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:
对于 运行 包含 returns 多个记录集的存储过程的用例,一个更可持续的选择是为 Node.js 使用最新版本的官方 Microsoft SQL 服务器客户端。有关 运行ning 存储过程的信息可用 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 服务。这是一个非常干净的解决方案。
我正在使用 sails js sails-mssqlserver 适配器。它的问题是,如果我的存储过程 returns 多个结果集,那么我只会收到一个最新的结果集。 相同的存储过程在 Java 上运行良好,我开始迭代相关的结果集。
我想知道是否有一些特定的方法可以访问 sails-mssqlserver 中的所有结果集?
sails-mssqlserver 适配器是官方 Microsoft SQL 服务器客户端的包装器 Node.js 可用 here 但它的依赖性不在最新版本中。
选项 1: 根据 MsSQL 包的官方文档,您可以使用 request.multiple = true 命令在查询中启用多个记录集。
要在 sails-mssqlserver 适配器中启用多个 queries/recordsets,一个 hackish 解决方法是打开 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: 对于 运行 包含 returns 多个记录集的存储过程的用例,一个更可持续的选择是为 Node.js 使用最新版本的官方 Microsoft SQL 服务器客户端。有关 运行ning 存储过程的信息可用 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 服务。这是一个非常干净的解决方案。