新しいことにはウェルカム

技術 | 電子工作 | ガジェット | ゲーム のメモ書き

JavaScriptでMicrosoft SQL Serverを使う方法

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.tokentrueにします。

すると、debugイベントが発生するようになるので、debugイベントハンドラを登録してメッセージを表示するようにします。

関連カテゴリー記事

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com