セールスjsと一緒にsails-mssqlserverアダプターを使用しています。問題は、私のストアドプロシージャが複数の結果セットを返す場合、私はすべての最新の結果セットを1つだけ受け取るということです。 同じストアドプロシージャがJavaで正常に動作しており、関連する結果セットを反復処理します。複数の結果セットをセールで取得するjs
sails-mssqlserverのすべての結果セットにアクセスする特定の方法があるかどうかを知る必要がありますか?
セールスjsと一緒にsails-mssqlserverアダプターを使用しています。問題は、私のストアドプロシージャが複数の結果セットを返す場合、私はすべての最新の結果セットを1つだけ受け取るということです。 同じストアドプロシージャがJavaで正常に動作しており、関連する結果セットを反復処理します。複数の結果セットをセールで取得するjs
sails-mssqlserverのすべての結果セットにアクセスする特定の方法があるかどうかを知る必要がありますか?
sails-mssqlserverアダプターは、Node.js用の正式なMicrosoft SQL Serverクライアントのラッパーです。hereただし、最新のリリースではありません。
オプション1: のMSSQLパッケージのこの公式ドキュメントを1として、あなたは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クライアントの最新バージョンを使用することであるユースケースのためのより持続可能なオプションあなたはMSSQLデータベースへの接続を追加するストアドプロシージャを実行したいあなたのコードで
npm install mssql --save
:
// 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()
ストアドプロシージャを実行している上の情報は、第1には、最新のパッケージをインストール
here
可能です
sails- *データベースアダプタに必要なすべての機能が含まれていない場合。私は、追加の機能を包むセイルサービスを作成することをお勧めします。それは本当にきれいな解決策です。
あなたの答えは問題の文脈では満足いくものと思われます。しかし、私はある時点で修正したい。 私の知る限り、 'request.multiple = true'は単一のクエリ文字列で複数のクエリを実行できるようにします。したがって、複数のレコードセットを返します。 私の場合、複数のレコードセットがストアドプロシージャによって返されます。したがって、 'request.multiple = true'は、ストアドプロシージャによって返される複数の結果セットに何の違いもありません。 例、 'const request = new sql.Request(); request.multiple = true; ( )); –
私は、アダプタコードを無効にすると** 1が発生する可能性があると考えています。最新バージョンのサポートに関する問題。 2.デプロイメントの問題**私はModelクラスのメソッドをオーバーライドする方が好きです**むしろノードモジュールの変更を行います。 –
あなたの知識のためだけではありません。 [npm mssql](https://www.npmjs.com/package/mssql)を参照してください。 'request.multiple'サポートはモジュールの最新バージョンから削除されました。 –
アダプターの設定とモデルメソッドの呼び出しをコピーできますか? –