LoginSignup
0
0

More than 3 years have passed since last update.

node-mssql を普通にinstallするとパラメータクエリーに使う .input() で型指定がうまくいかない原因と対策

Posted at

概要

node-mssql とは SQLServer に node.js から接続するモジュール。
これを普通に

npm install mssql

でインストールすると、v5 台が入ります。
ですがこれで、ドキュメントにあるように

let result1 = await pool.request()
            .input('input_parameter', sql.Int, value)
            .query('select * from mytable where id = @input_parameter')

とやっても

parameter.type.validate is not a function

というエラーが出てSQLが実行されません。

エラーの意味

これは、sql.Int が正しい型ではないという意味のエラーのようです。
実際、ソースを追いかけると、sql.Int().type.validate を実行しようとしてエラーとなっているようです。

なぜエラーになるのか。

この type の構造は、v6 台(まだ beta)で大きく変わっているのですが、
validate メソッドはそちらには存在しています。
つまり、v5 で v6 のメソッド呼んでエラーになってる感じです。

勝手な想像ですが、開発されている方が v5 で構造変えて、v6 にもっていって、v5 はテストしないまま、v6 にフォーカスしてしまっているのではないかと。

対処法

1. 型を省略する

let result1 = await pool.request()
            .input('input_parameter', value)  // 型省略
            .query('select * from mytable where id = @input_parameter')

とりあえず、これで動きます。
NVarChar型Date型 を明示したい時など困りそうですが。。。

2. 変更後の構造で指定する

tedious の型に依存しているので、tedious から型情報をもっていきます。

let result1 = await pool.request()
            .input('input_parameter', () => ({ type: require('tedious').TYPES.Int }), value)
            .query('select * from mytable where id = @input_parameter')

とりあえず、動きますが、これ書くのは嫌ですね。
どこかでプルリク出そうかな。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0