windows環境にて
Node.js+Express+SQLServerでアプリ開発を行おうとしております。
下記のサイトを参考に、jsにてDB接続、SQLの実行を行い、結果をejsにて表示させています。
http://hiyo-ac.hatenablog.com/entry/2018/01/28/141831
SQLが1つ(表が1つ)の場合はうまく動作することが確認できましたが、
1つの画面に複数の表を設置(複数SQLを実行し、複数の結果を取得・表示)したい場合、どうコーディングしたら良いのかがわかりません。
ソースは下記のとおりです。(上記サイトそのままです)
router.get('/', function(req, res, next) { var connection = new Connection(config); var content = []; // DBからselectした結果を格納する変数 // DB接続した際のイベントハンドラ connection.on('connect', function(err){ console.log("connected"); executeStatement(); }); // DB接続を終了した際のイベントハンドラ // DB接続を切断した後に画面を描写する connection.on('end', function(){ console.log("disconnected"); res.render('sample', { title: 'sqlserver-sample', content: content }); }); var Request = require('tedious').Request; // SQLを発行する関数 function executeStatement(){ // 発行するSQLを記載する request = new Request("SELECT * FROM TestDB.dbo.TB_TestTable with (NOLOCK)", function(err){ if(err){ console.log(err);} }); var result = {}; // SQLの結果を行ごとにオブジェクトに格納する。 // SQLの行ごとに実行するイベントハンドラ request.on('row', function(columns){ columns.forEach(function(column){ if(column.value === null){ console.log('NULL'); }else{ result[column.metadata.colName] = column.value; } }); content.push(result); result = {}; }); // SQLのリクエスト完了時のイベントハンドラ。 // コネクションをクローズしないとDBにいらないプロセスが残るので、コネクションをクローズする。 request.on('requestCompleted', function(){ console.log('requestCompleted'); connection.close(); }); // DBへSQLを発行する。 connection.execSql(request); } });
下記のように、新しいコネクションと結果を入れるcontentを用意して、
1つめのSQLを実行後にくっつけてみましたがうまく動作しませんでした。
router.get('/', function(req, res, next) { var connection = new Connection(config); var content = []; // DBからselectした結果を格納する変数 // DB接続した際のイベントハンドラ connection.on('connect', function(err){ console.log("connected"); executeStatement(); }); // DB接続を終了した際のイベントハンドラ // DB接続を切断した後に画面を描写する connection.on('end', function(){ console.log("disconnected"); res.render('sample', { title: 'sqlserver-sample', content: content }); }); var Request = require('tedious').Request; // SQLを発行する関数 function executeStatement(){ // 発行するSQLを記載する request = new Request("SELECT * FROM TestDB.dbo.TB_TestTable with (NOLOCK)", function(err){ if(err){ console.log(err);} }); var result = {}; // SQLの結果を行ごとにオブジェクトに格納する。 // SQLの行ごとに実行するイベントハンドラ request.on('row', function(columns){ columns.forEach(function(column){ if(column.value === null){ console.log('NULL'); }else{ result[column.metadata.colName] = column.value; } }); content.push(result); result = {}; }); // SQLのリクエスト完了時のイベントハンドラ。 // コネクションをクローズしないとDBにいらないプロセスが残るので、コネクションをクローズする。 request.on('requestCompleted', function(){ console.log('requestCompleted'); connection.close(); }); // DBへSQLを発行する。 connection.execSql(request); } var connection2 = new Connection(config); var content2 = []; // DBからselectした結果を格納する変数 // DB接続した際のイベントハンドラ connection2.on('connect', function(err){ console.log("connected"); executeStatement(); }); // DB接続を終了した際のイベントハンドラ // DB接続を切断した後に画面を描写する connection2.on('end', function(){ console.log("disconnected"); res.render('sample', { title: 'sqlserver-sample', content: content }); }); var Request2 = require('tedious').Request; // SQLを発行する関数 function executeStatement(){ // 発行するSQLを記載する request2 = new Request("SELECT * FROM TestDB.dbo.TB_TestTable2 with (NOLOCK)", function(err){ if(err){ console.log(err);} }); var result = {}; // SQLの結果を行ごとにオブジェクトに格納する。 // SQLの行ごとに実行するイベントハンドラ request2.on('row', function(columns){ columns.forEach(function(column){ if(column.value === null){ console.log('NULL'); }else{ result[column.metadata.colName] = column.value; } }); content2.push(result); result = {}; }); // SQLのリクエスト完了時のイベントハンドラ。 // コネクションをクローズしないとDBにいらないプロセスが残るので、コネクションをクローズする。 request2.on('requestCompleted', function(){ console.log('requestCompleted'); connection2.close(); }); // DBへSQLを発行する。 connection2.execSql(request2); } });
調べても複数SQLを実行しているサンプルコードが見当たらず、質問させていただきました。
初歩的な質問で申し訳ございません。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/15 01:46 編集