deezus blog

.Net Core、Typescriptを中心に技術的ノウハウを公開しています

node.jsでSQLServerに接続する

はじめに

typescript+node.jsでSQLServerに接続するにはmssqlを使用します

インストール方法

npmでインストールします

npm install mssql --save

typescriptを使用するので型定義もインストールします

npm install @types/mssql --save-dev

使い方

データベースへの接続

import { ConnectionPool } from 'mssql';
const pool = new ConnectionPool({
            user: '[ユーザーID]',
            password:  '[パスワード]',
            database: '[データベース名]',
            server: '[データベースのホスト]',
            options: {
                encrypt: true
            }
        });
pool.connect();

connect()はPromiseを返しますので、awaitを使って下記のようにできます

await pool.connect();

一連の処理を一つの関数にすると下記のようになります

const mssqlConnect = async () => {
    const pool = new ConnectionPool({
            user: '[ユーザーID]',
            password:  '[パスワード]',
            database: '[データベース名]',
            server: '[データベースのホスト]',
            options: {
                encrypt: true
            }
        });
    await pool.connect();
    return pool;
}

クエリの実行

const data = pool.request().query('SELECT * FROM [テーブル名]');
for (const row of data.recordset) {
    console.log(row['カラム名']);
}

パラメータを指定する場合は下記のようにします

const request = pool.request();
request.input('id', 1); // パラメータを指定
const data = request.query('SELECT * FROM [テーブル名] WHERE ID = @id');
for (const row of data.recordset) {
    console.log(row['カラム名']);
}

トランザクション

トランザクション開始

const transaction = new Transaction(pool);
await transaction.begin();

コミット

await transaction.commit();

ロールバック

await transaction.rollback()

クラス例

import {ConnectionPool, Transaction} from 'mssql';
export class MsSql {
    private pool: ConnectionPool;
    private transaction: Transaction;

    /**
     * 接続
     * @param {string} host
     * @param {string} user
     * @param {string} password
     * @param {string} database
     * @returns {Promise}
     */
    public async connect(host: string, user: string, password: string, database: string) {

        this.pool = new ConnectionPool({
            server: host,
            user: user,
            password: password,
            database: database,
            options: {
                encrypt: true
            }
        });
        await this.pool.connect();
    }

    /**
     * トランザクション開始
     * @returns {Promise}
     */
    public async beginTransaction() {
        this.transaction = new Transaction(this.pool);
        await this.transaction.begin();
    }

    /**
     * トランザクションコミット
     * @returns {Promise}
     */
    public async commit() {
        await this.transaction.commit();
    }

    /**
     * トランザクションロールバック
     * @returns {Promise}
     */
    public async rollback() {
        await this.transaction.rollback();
    }

    /**
     * クエリ実行
     * @param {string} query
     * @param parameters
     * @returns {Promise>}
     */
    public async query(query: string, parameters: {[key: string]: any} = {}) {
        const request = this.pool.request();
        for (const name in Object.keys(parameters)) {
            request.input(name, parameters[name]);
        }
        return (await request.query(query)).recordset;
    }
}