Nodejs MSSQL详细解读

MSSQL 是Nodejs用于连接Microsoft SQL Server 的插件。

安装方法

npm install mssql

配置Config

const config = {
    user: '...',
    password: '...',
    server: 'localhost', 
    database: '...',
    options: {
        encrypt: true //使用windows azure,需要设置次配置。
    }
}
user:SQL Server 的登录名
password: SQL Server的登录密码
server:SQL Server的地址
port:端口号,默认为1433
domain:设置domain后,可通过domain连接数据库
database:数据库名称
connectionTimeout:连接timeout,单位ms 默认 15000
requestTimeout:请求timeout,单位ms默认15000
parseJSON:将json数据集转化成json obj
pool.max:连接池最大连接数,默认10
pool.min:连接池最小连接数,默认0
pool.idleTimeoutMillis:设置关闭未使用连接的时间,单位ms默认30000
快速开始


const sql = require('mssql') //声明插件
sql.connect(config).then(() => {
    return sql.query`select * from mytable where id = ${value}`
}).then(result => {
    //请求成功
}).catch(err => {
    //err 处理
})
sql.on('error', err => {
    //error 处理
})
Streaming流


如果表格查询的数据量过大,使用Streaming流可以很好地将数据展示出来。
const sql = require('mssql')
sql.connect(config, err => {
    const request = new sql.Request()
    request.stream = true //开启streaming
    request.query('select * from verylargetable') //或者执行request.execute(procedure)
    request.on('recordset', columns => {
        //每次查询会触发一次 recordset事件,返回结果集
    })
    request.on('row', row => {
        //每个结果集会出发row事件,返回row信息
    })
    request.on('error', err => {
        //监听error事件,可能被触发多次
    })
    request.on('done', result => {
        //最后触发
    })
})
sql.on('error', err => {
    //error 处理
})
POOL连接池


数据库连接是非常占用资源的,尤其是在高并发的情况下,如果每次都去建立数据库连接就会有性能问题,也会影响一个应用程序的延展性,
针对这个问题,连接池出现了,连接池就是为了解决这个问题的。
new sql.ConnectionPool(config).connect().then(pool => {
    return pool.query`select * from mytable where id = ${value}`
}).then(result => {
    console.dir(result)
}).catch(err => {
})

pool.close()非常重要,只创建,不关闭会造成非常严重的内存泄漏。

创建请求及取消请求


//创建请求:
const request = new sql.Request(/* [pool 或 transaction] */)

//取消请求:
const request = new sql.Request()
request.query('waitfor delay \'00:00:05\'; select 1 as number', (err, result) => {
})
request.cancel() //取消之前所有的query动作

Bulk创建Table

const table = new sql.Table('table_name') 
table.create = true
table.columns.add('a', sql.Int, {nullable: true, primary: true})
table.columns.add('b', sql.VarChar(50), {nullable: false})
table.rows.add(777, 'test')//添加一行信息
const request = new sql.Request()
request.bulk(table, (err, result) => {
})

Execute

执行进程

const request = new sql.Request()
request.input('input_parameter', sql.Int, value)
request.output('output_parameter', sql.Int)
request.execute('procedure_name', (err, result) => {
})

Input(name,type,value)给request添加一个因数

Output(name,type,(value)) 将request返回值,放入name中

Transaction

保证全部的query request在一个连接中完成。Begin创建连接,commit(完成)或者rollback(回滚)释放连接。

const transaction = new sql.Transaction(/* [pool] */)
transaction.begin(err => { 
    const request = new sql.Request(transaction)
    request.query('insert into mytable (mycolumn) values (12345)', (err, result) => { 
        transaction.commit(err => { 
            console.log("Transaction committed.")
        })
    })
})

Prepared Statement

与transaction很像,但是此处确保全部的procedure在一个连接中执行。Prepare创建连接,unpare释放连接。

const ps = new sql.PreparedStatement(/* [pool] */)
ps.input('param', sql.Int)
ps.prepare('select @param as value', err => { 
    ps.execute({param: 12345}, (err, result) => {
        ps.unprepare(err => {
        })
    })
})

CLI

2.0版本后,mssql便支持CLI功能

安装方法:npm install mssql -g ,需要安装至全局

编辑config文件,命名为.mssql.json

执行

echo "select * from mytable" | mssql /path/to/config
//便可打印出查询信息