10

セールスjsと一緒にsails-mssqlserverアダプターを使用しています。問題は、私のストアドプロシージャが複数の結果セットを返す場合、私はすべての最新の結果セットを1つだけ受け取るということです。 同じストアドプロシージャがJavaで正常に動作しており、関連する結果セットを反復処理します。複数の結果セットをセールで取得するjs

sails-mssqlserverのすべての結果セットにアクセスする特定の方法があるかどうかを知る必要がありますか?

+1

アダプターの設定とモデルメソッドの呼び出しをコピーできますか? –

答えて

7

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- *データベースアダプタに必要なすべての機能が含まれていない場合。私は、追加の機能を包むセイルサービスを作成することをお勧めします。それは本当にきれいな解決策です。

+1

あなたの答えは問題の文脈では満足いくものと思われます。しかし、私はある時点で修正したい。 私の知る限り、 'request.multiple = true'は単一のクエリ文字列で複数のクエリを実行できるようにします。したがって、複数のレコードセットを返します。 私の場合、複数のレコードセットがストアドプロシージャによって返されます。したがって、 'request.multiple = true'は、ストアドプロシージャによって返される複数の結果セットに何の違いもありません。 例、 'const request = new sql.Request(); request.multiple = true; ( )); –

+0

私は、アダプタコードを無効にすると** 1が発生する可能性があると考えています。最新バージョンのサポートに関する問題。 2.デプロイメントの問題**私はModelクラスのメソッドをオーバーライドする方が好きです**むしろノードモジュールの変更を行います。 –

+0

あなたの知識のためだけではありません。 [npm mssql](https://www.npmjs.com/package/mssql)を参照してください。 'request.multiple'サポートはモジュールの最新バージョンから削除されました。 –

関連する問題