質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

6155閲覧

Node.jsでMicrosoft SQL Serverに接続したい

AGadget

総合スコア60

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2020/02/06 00:19

Node.jsを用いてMicrosoft SQL Serverに接続する方法を探しております。

実現したいこと

Node.jsからlocalhostのデータベース「database_1」のテーブル「table_1」のレコードを全て取得し、コンソールに出力する。

試したこと

以下、内容を実行してみました。

JavaScript

1const tedious = require("../node_modules/tedious"); 2const connection = new tedious.Connection({ 3 server: "localhost", 4 authentication: { 5 type: "default", 6 options: { 7 userName: "AGadget", 8 password: "0123456789" 9 }, 10 database: "database_1" 11 } 12}); 13connection.on("connect", (err) => { 14 console.log("接続されました!"); 15 const request = new tedious.Request("SELECT * FROM table_1;", (err, rowCount) => { 16 if (err) { 17 console.log(err); 18 } else { 19 console.log(rowCount); 20 } 21 connection.close(); 22 }); 23 request.on("row", (columns) => { 24 for (const column of columns) { 25 if (column.value === null) { 26 console.log("NULL"); 27 } else { 28 console.log(column.value); 29 } 30 } 31 }); 32 request.on("done", (rowCount) => { 33 console.log(rowCount); 34 }); 35});
試した結果

「接続されました!」とだけ表示されます。それ以外は一切何も(もちろん、エラーメッセージも)表示されず処理が終了します。

考えていること

「接続されました!」と表示される――つまり、connection.on("connect"); 内の処理が走っているということは、ひとまず接続自体には成功しているということでしょうか?

長くなりましたが、ご回答のほど、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi-sun

2020/02/06 01:49

> connection.on("connect", (err) => { このerr引数をconsole.logなんかで開いて確認しましたか? ここが一番の大事なポイントなので出力させてみてください。
AGadget

2020/02/06 02:18

ご回答ありがとうございます! > このerr引数をconsole.logなんかで開いて確認しましたか? > ここが一番の大事なポイントなので出力させてみてください。 早速、試してみました! 以下がその結果出力されたものです。 「Connection Error」ということで何らかの理由からSQL Serverと接続できないようです。 ConnectionError: Failed to connect to localhost:1433 - Could not connect (sequence) at ConnectionError (C:\Users\AGadget\Desktop\DB\node_modules\tedious\lib\errors.js:13:12) at Connection.socketError (C:\Users\AGadget\Desktop\DB\node_modules\tedious\lib\connection.js:1288:56) at C:\Users\AGadget\Desktop\DB\node_modules\tedious\lib\connection.js:1114:21 at SequentialConnectionStrategy.connect (C:\Users\AGadget\Desktop\DB\node_modules\tedious\lib\connector.js:87:14) at Socket.onError (C:\Users\AGadget\Desktop\DB\node_modules\tedious\lib\connector.js:100:12) at Socket.emit (events.js:210:5) at emitErrorNT (internal/streams/destroy.js:92:8) at emitErrorAndCloseNT (internal/streams/destroy.js:60:3) at processTicksAndRejections (internal/process/task_queues.js:80:21) { message: 'Failed to connect to localhost:1433 - Could not connect (sequence)', code: 'ESOCKET' }
AGadget

2020/02/06 02:37

PS) ConnectionErrorであることは分かりましたがDBと接続できない理由が「DBの存在は認識しているけれども接続できない」のか「そもそも指定されたDBを見つけることができていない」のか気になったので、接続先を「localhost」から意味不明な文字列「abcdef」などに変えてみたところ、少しエラーメッセージが変わっていることに気が付きました。 localhostを指定したときは「ConnectionError: Failed to connect to localhost:1433 - Could not connect (sequence)」。 これは「ConnectionError: Failed to connect to abcdef:1433 - getaddrinfo ENOTFOUND abcdef」 エラーメッセージを読む限りでは「abcdefは見つけられなかった」ということかと思います。 このことからlocalhost接続によるConnectionErrorは「DBは見つけているけれど何らかの理由で接続できない」ということなのかなぁ、と思っています。となると、セキュリティ関連で弾かれているような気がしますので、そのあたりを調べてみようと思います。 ConnectionError: Failed to connect to abcdef:1433 - getaddrinfo ENOTFOUND abcdef at ConnectionError (C:\Users\AGadget\Desktop\DB\node_modules\tedious\lib\errors.js:13:12) at Connection.socketError (C:\Users\AGadget\Desktop\DB\node_modules\tedious\lib\connection.js:1288:56) at C:\Users\AGadget\Desktop\DB\node_modules\tedious\lib\connection.js:1114:21 at GetAddrInfoReqWrap.callback (C:\Users\AGadget\Desktop\DB\node_modules\tedious\lib\connector.js:158:16) at GetAddrInfoReqWrap.onlookupall [as oncomplete] (dns.js:72:17) { message: 'Failed to connect to abcdef:1433 - getaddrinfo ENOTFOUND abcdef', code: 'ESOCKET' }
miyabi-sun

2020/02/06 02:45

問題を切り分けてみましょうか? こういう時は、SQLサーバへ接続して作業出来るクライアントソフトを用意してくるのが一番です! https://docs.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15 別で用意出来たクライアントソフトで接続出来るのであればNode.jsが悪いという事になりますし、 そうでなければWindowsのファイアウォールソフト等が原因でサーバとしての要件を満たせて居ないことになります。 既に後者とわかっているなら、Windows10の場合こんな感じのソフトウェアによるファイアウォールがあるので設定してみてください。 https://support.microsoft.com/ja-jp/help/4028544/windows-10-turn-windows-defender-firewall-on-or-off
AGadget

2020/02/06 02:53

> 別で用意出来たクライアントソフトで接続出来るのであればNode.jsが悪いという事になりますし、そうでなければWindowsのファイアウォールソフト等が原因でサーバとしての要件を満たせて居ないことになります。 早速確認してみたところSSMSからは接続できました。Windows認証・SQL Server認証ともにセーフでした! また、コマンドラインからSqlcmdユーティリティを使ってクエリを発行してみましたが、こちらも正常に動きました。 このことから、ご指摘の通りNode.js側に原因があるのではないかと思います。 ひとまず接続に使用しているモジュールtediousのリファレンスを探してみたり、別のモジュールを使ったらどうなるかを検証してみたいと思います。
shinami

2020/02/08 00:47

私はNode.jsは分からないのですがSQLServerのインスタンスは既定のインスタンスですか?名前付きインスタンスですか?(ExpressEditionではSQLEXPRESS) 名前付きインスタンスを使っている場合はlocalhost\インスタンス名(またはlocalhost\\インスタンス名)となるはずです。 ManagementStudioのログインダイアログでサーバー名を確認してみてください。 また、localhostへのアクセスはポート1433は不要の気がします。 また、Windows認証を使うかSQLServer認証を使うかの指定もどこかでしなければならないかもしれません。integreted securityまたはtrusted connectionあたりを調べてみてください。※指定しなければどちらかが有効になるのかもしれませんが私はNode.jsを使ったことが無いので・・・。
AGadget

2020/02/09 13:14

ご回答ありがとうございます! > 私はNode.jsは分からないのですがSQLServerのインスタンスは既定のインスタンスですか?名前付きインスタンスですか?(ExpressEditionではSQLEXPRESS) 既定のインスタンスでした! ちなみに、接続サーバー先を「localhost\SQLEXPRESS」とか「localhost\\SQLEXPRESS」などにして試してみたのですが、やはり繋がらなかったです。 > また、localhostへのアクセスはポート1433は不要の気がします。 また、Windows認証を使うかSQLServer認証を使うかの指定もどこかでしなければならないかもしれません。integreted securityまたはtrusted connectionあたりを調べてみてください。 integreted security・trusted connectionは知りませんでした。早速、調べてみようと思います。
shinami

2020/02/10 11:45 編集

既定のインスタンスならlocalhostで良いと思います。 ※localhostの所は、(local)や127.0.0.1や.(ピリオド)などでも良いかもしれません。 Windows認証orSQLServer認証を使う設定はなさそうですね。 https://tediousjs.github.io/tedious/api-connection.html あとは、 SQLServer構成マネージャー(configuration manager)がメニューにありますのでそれを開いて SQLServerネットワークの構成のTCP/IPは有効になっていなければ有効にする。 それでだめなら、構成マネージャーのSQLServerのSQL Server Browserも有効になっていなければ 有効にしてみるとかですかね。 https://stackoverflow.com/questions/25577248/node-js-mssql-tedius-connectionerror-failed-to-connect-to-localhost1433-conn
guest

回答1

0

「接続されました!」と表示される――つまり、connection.on("connect"); 内の処理が走っているということは、ひとまず接続自体には成功しているということでしょうか?

接続は成功しています。

クエリを実行するには、connection.execSql(request);を実行する必要があります。
実行された内容は、tedious.Requestの作成をしただけで実行をしていません。
以下のように、connection.execSql(request)を追記することで、"SELECT * FROM table_1;"のクエリが実行されます。

js

1const tedious = require("../node_modules/tedious"); 2const connection = new tedious.Connection({ 3 server: "localhost", 4 authentication: { 5 type: "default", 6 options: { 7 userName: "AGadget", 8 password: "0123456789" 9 }, 10 database: "database_1" 11 } 12}); 13connection.on("connect", (err) => { 14 console.log("接続されました!"); 15 const request = new tedious.Request("SELECT * FROM table_1;", (err, rowCount) => { 16 if (err) { 17 console.log(err); 18 } else { 19 console.log(rowCount); 20 } 21 connection.close(); 22 }); 23 request.on("row", (columns) => { 24 for (const column of columns) { 25 if (column.value === null) { 26 console.log("NULL"); 27 } else { 28 console.log(column.value); 29 } 30 } 31 }); 32 request.on("done", (rowCount) => { 33 console.log(rowCount); 34 }); 35 36 connection.execSql(request); // 追加した処理 37});

tediousのGitHubにExampleも用意されてますので、そちらを参照されるのが一番正しい情報が得られるでしょう。

投稿2020/03/16 02:12

編集2020/03/16 12:26
70_10

総合スコア65

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問