JavaScriptでMicrosoft SQL Server(MSSQL)を使う方法メモです。
ライブラリはMicrosoftも推奨しているtediousを使い、あまり凝ったことはせず、必要最低限の機能に絞ってまとめました。
tedios
はコールバックスタイルのライブラリなのですが、今風にasync・await・TypeScriptで書いてます。
インストール
npm install tedious npm install @types/tedious
サンプル
import { Connection, ConnectionConfig, Request, TYPES, TediousType, } from 'tedious' interface inputParam { name: string; type: TediousType; value: any; }; async function createConnection(): Promise<Connection> { return new Promise((resolve, reject) => { const config: ConnectionConfig = { server: '<server_url>', authentication: { type: 'default', options: { userName: '<user_name>', password: '<password>', }, }, options: { database: '<db_name>', encrypt: true, debug: { // debug output token: true, }, } }; const con = new Connection(config); con.on('debug', (msg) => { console.log(msg); }); con.on('connect', (err) => { if (!err) { resolve(con); } else { reject(err); } }); con.connect(); }); } function execSql(con: Connection, sql: string, params: Array<inputParam>): Promise<Array<any>> { return new Promise((resolve, reject) => { const rows: Array<any> = []; const request = new Request(sql, (err, rowCount) => { if (err) { reject(err); } else { console.log(`done : rowCount->${rowCount}`); resolve(rows); } }); for (const param of params) { request.addParameter(param.name, param.type, param.value); } request.on('row', (cols) => { const row: any = {}; cols.forEach(col => { row[col.metadata.colName] = col.value; }); rows.push(row); }); con.execSql(request); }); } (async () => { let con: Connection; try { con = await createConnection(); const sql = ` SELECT * FROM [dbo].[tbl_user] WHERE [user_name] LIKE @param_user_name `; const params: Array<inputParam> = [ { name: 'param_user_name', type: TYPES.NVarChar, value: 'a%', } ]; const rows = await execSql(con, sql, params); for (const row of rows) { console.log(row); } await con.close(); } catch (err) { console.error(err); await con.close(); } })();
説明
クエリ実行
クエリを実行すると、1行毎にrow
イベントが呼び出され、クエリが終了するとRequest
生成時に登録したコールバック関数が呼び出されます。
execSql()
を実行すると、結果が配列で返ってきます。
クエリパラメータ
クエリに@<param_name>
でクエリパラメータを埋め込むことができます。エスケープ処理をしてくれるので、クエリに値を渡したい時は絶対に使った方がいいです。
パラメータを使わない時はexecSql()
に空配列を渡します。
パラメータには、パラメータ名のname
と、データ型のtype
と、パラメータ値のvalue
が必要で、入力ミス防止にそれらをまとめた型inputParam
を定義しています。
データ型の種類はTYPES
に定義されています。型が間違っているとエラーになるのですが、エラー文に正しい型が記載されるのでどう修正すればいいのか分かります。
デバッグ
デバッグ表示をする場合はConnection
のオプションのoptions.debug.token
をtrue
にします。
すると、debug
イベントが発生するようになるので、debug
イベントハンドラを登録してメッセージを表示するようにします。