tedious + Typescript の実装サンプル

tediousを使用したDB接続実装サンプル

〇サンプルに使用するテーブル

CREATE TABLE shopping_items (
    id bigint IDENTITY(1,1) NOT NULL,
    name varchar(40) COLLATE Japanese_CI_AS NOT NULL,
    price int NOT NULL,
    suryo int NULL,
    description varchar(100) COLLATE Japanese_CI_AS NULL,
    version int NOT NULL,
    CONSTRAINT shopping_items_pk PRIMARY KEY (id)
);

tediousのインストール

tedious

npm install tedious

〇package.json

{
  "name": "aa",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "tedious": "^14.5.0",
    "typescript": "^4.7.3"
  }
}

接続先の設定

import {Connection, TYPES, Request} from 'tedious';

var config = {
    server: 'localhost',
    authentication: {
        type: 'default',
        options: {
            userName: 'aa00001',
            password: 'Xaa00001'
        }
    },
    options: {
        port: 1433,
        database: 'Test'
    }
};

コネクションの確立

connection.connect()メソッドでコネクションを確立する。

// コネクションの確立
const connection = new Connection(config);
// コネクション確立時の処理を記述する
connection.on('connect', (error) => {
    if(!error){
        console.log('connected!');
        executeStatement();
    }
})
connection.connect();

DB操作処理の記述

function executeStatement() {
    // SELECTサンプル
    request = new Request('SELECT * FROM shopping_items', (error) => {
        if(error) {
            console.log(error);
        }
    });

    // 検索結果の処理サンプル
    request.on('row', (columns) => {
        columns.forEach(column => {
            if(column.value !== null){
                console.log(column.value);
            }
        });
    });

    // INSERTサンプル
    // バインド変数サンプル
    const request = new Request("INSERT INTO shopping_items (item_name, item_price, item_suryo, item_description, version) VALUES(@itemName, @itemPrice, @itemSuryo, @itemDescription, 1)", (error) => {
        if(error) {
            console.log(error);
        }

        createTransaction();
    });

    request.addParameter('itemName', TYPES.NVarChar, 'タルト');
    request.addParameter('itemPrice', TYPES.Int, 580);
    request.addParameter('itemSuryo', TYPES.Int, 5);
    request.addParameter('itemDescription', TYPES.NVarChar, '美味しい');

    // クエリ実行
    connection.execSql(request);
}

トランザクション処理

// トランザクションサンプル
function createTransaction(){
    connection.beginTransaction(error => {
        if(error){
            rollback();
        } else {
            commit();
        }
    });
}

// コミットサンプル
function commit() {
    connection.commitTransaction(error => {
        if (error) {
            console.log(error);
        }
        console.log('commit!');
        connection.close();
    })
}

// ロールバックサンプル
function rollback() {
    connection.rollbackTransaction(error => {
        if(error) {
            console.log(error);
        }
        console.log('rollback!');
        connection.close();
    })
}

〇index.tsの全体

import {Connection, TYPES, Request} from 'tedious';

// 接続先の設定
var config = {
    server: 'localhost',
    authentication: {
        type: 'default',
        options: {
            userName: 'aa00001',
            password: 'Xaa00001'
        }
    },
    options: {
        port: 1433,
        database: 'Test'
    }
};

// コネクションの確立
const connection = new Connection(config);

connection.on('connect', (error) => {
    if(!error){
        console.log('connected!');
        executeStatement();
    }
})
connection.connect();

function executeStatement() {
    // SELECTサンプル
    request = new Request('SELECT * FROM shopping_items', (error) => {
        if(error) {
            console.log(error);
        }
    });

    // 検索結果の処理サンプル
    request.on('row', (columns) => {
        columns.forEach(column => {
            if(column.value !== null){
                console.log(column.value);
            }
        });
    });

    // INSERTサンプル
    // バインド変数サンプル
    const request = new Request("INSERT INTO shopping_items (item_name, item_price, item_suryo, item_description, version) VALUES(@itemName, @itemPrice, @itemSuryo, @itemDescription, 1)", (error) => {
        if(error) {
            console.log(error);
        }

        createTransaction();
    });

    request.addParameter('itemName', TYPES.NVarChar, 'タルト');
    request.addParameter('itemPrice', TYPES.Int, 580);
    request.addParameter('itemSuryo', TYPES.Int, 5);
    request.addParameter('itemDescription', TYPES.NVarChar, '美味しい');

    // クエリ実行
    connection.execSql(request);
}

// トランザクションサンプル
function createTransaction(){
    connection.beginTransaction(error => {
        if(error){
            rollback();
        } else {
            commit();
        }
    });
}

// コミット処理サンプル
function commit() {
    connection.commitTransaction(error => {
        if (error) {
            console.log(error);
        }
        console.log('commit!');
        connection.close();
    })
}

// ロールバック処理サンプル
function rollback() {
    connection.rollbackTransaction(error => {
        if(error) {
            console.log(error);
        }
        console.log('rollback!');
        connection.close();
    })
}