Nodejs之mssql模块的封装

在nodejs中,mssql模块支持sqlserver数据库操作。今天将mssql模块的某些功能封装为一个类,方便以后调用。封装的功能有执行存储过程,执行查询语句操作等。如果本篇文章对大家有帮助,那就再好不过了!

要使用mssql模块,请先用npm加载到项目中。加载过程:打开cmd命令框,定位到项目的根目录下,输入npm install mssql --save ,然后按回车键就OK!

封装的代码如下:

//导入mssql模块
var mssql=require("mssql");

var sql={};

//连接参数配置
var config={
    user:"sa",
    password:"wsjun123456",
    server:"localhost", // You can use ‘localhost\\instance‘ to connect to named instance
    database:"mydb",
    stream:false, // You can enable streaming globally
    /*option:{
     encrypt:true //Use this if you‘re on Windows Azure
     },*/
    pool:{
        min:0,
        idleTimeoutMillis:3000
    }
};

sql.sqlserver=mssql;

//sql参数的类型
sql.direction={
    //输入参数
    Input:"input",
    //输出参数
    Output:"output",
    //返回参数
    Return:"return"
};

/**
 * 初始化连接参数
 * @param {string} user 用户名
 * @param {string} password 密码
 * @param {string} server 服务器地址
 * @param {string} database 数据库名称
 */
sql.initConfig=function(user,password,server,database){
    config={
        user:user,
        password:password,
        server:server, // You can use ‘localhost\\instance‘ to connect to named instance
        database:database,
        stream:false,
        /*option:{
         encrypt:true //Use this if you‘re on Windows Azure
         },*/
        pool:{
            min:0,
            idleTimeoutMillis: 3000
        }
    };
}

/**
 * 执行存储过程
 * @param {string} procedure 存储过程名称
 * @param {JSON} params 存储过程参数
 * params的定义格式如:
    var params={
    //ID是存储过程的第一个参数,要去掉@符号
    ID:{
        //sqlType是该ID参数在sqlserver中的类型
        sqlType:sql.sqlserver.Int,
        //direction是表明ID参数是输入还是输出(output)参数
        direction:sql.direction.Input,
        //该ID参数的值
        inputValue:1
    },
    //Name是存储过程的第二个参数,要去掉@符号
    Name:{
        sqlType:sqlHelper.sqlserver.Int,
        direction:sqlHelper.direction.Output,
        outputValue:null
    }
};
 * @param {function} func 回调函数 共有四个参数 error:错误信息 recordsets:查询的表结果 returnValue:存储过程的返回值 affected:影响的行数
 */
sql.execute=function(procedure,params,func){
    try {
        var connection = new mssql.Connection(config, function (error) {
            if(error)
                func(error);
            else {
                var request = new mssql.Request(connection);
                //request.verbose=true;
                if (params != null) {
                    for (var index in params) {
                        if (params[index].direction == sql.direction.Output) {
                            request.output(index, params[index].sqlType);
                        }
                        else {
                            request.input(index, params[index].sqlType, params[index].inputValue);
                        }
                    }
                }
                request.execute(procedure, function (error, recordsets, returnValue, affected) {
                    if (error)
                        func(error);
                    else {
                        for (var index in params) {
                            if (params[index].direction == sql.direction.Output) {
                                params[index].outputValue = request.parameters[index].value;
                            }
                        }
                        func(error, recordsets, returnValue, affected);
                    }
                });
            }
        });

        connection.on("error", func);

    }catch(e){
        func(e);
    }
};

/**
 * 执行sql文本(带params参数)
 * @param {string} sqltext 执行的sql语句
 * @param {JSON} params sql语句中的参数
 * @param {function} func 回调函数 共有三个参数 error:错误消息 recordsets:查询的结果 affected:影响的行数
 */
sql.queryWithParams=function(sqltext,params,func){
    try {
        var connection = new mssql.Connection(config, function (err) {
            if(err)
                func(err);
            else {
                var request = new mssql.Request(connection);
                request.multiple=true;

                if(params){
                    for(var index in params){
                        request.input(index,params[index].sqlType,params[index].inputValue);
                    }
                }

                request.query(sqltext, func);
            }
        });
        connection.on("error",func);
    }catch(e){
        func(e);
    }
};

/**
 * 执行sql文本
 * @param {string} sqltext 执行的sql语句
 * @param {function} func 回调函数 共有三个参数 error:错误消息 recordsets:查询的结果 affected:影响的行数
 */
sql.query=function(sqltext,func){
    sql.queryWithParams(sqltext,null,func);
};

/**
 * 执行大批量数据的插入
 * @param {sqlserver.Table} table 需要插入的数据表
 * 数据表的定义如下:
 var table=new sql.sqlserver.Table(‘UserInfoTest‘);
 table.create=true;
 table.columns.add(‘name‘,sqlHelper.sqlserver.NVarChar(50),{nullable:true});
 table.columns.add(‘pwd‘,sqlHelper.sqlserver.VarChar(200),{nullable:true});
 table.rows.add(‘张1‘,‘jjasdfienf‘);
 table.rows.add(‘张2‘,‘jjasdfienf‘);
 table.rows.add(‘张3‘,‘jjasdfienf‘);
 * @param {function} func 回调函数 共有两个参数 error:错误信息 rowcount:插入数据的行数
 */
sql.bulkInsert=function(table,func){
    try{
        if(table){
            var connection=new mssql.Connection(config,function(err){
                if(err) func(err)
                else{
                    var request=new mssql.Request(connection);
                    request.bulk(table,func);
                }
            });
            connection.on("error",func);
        }
        else
            func(new ReferenceError(‘table parameter undefined!‘));
    }catch (e){
        func(e);
    }
};

/**
 * 如果需要处理大批量的数据行,通常应该使用流
 * @param {string} sqltext 需要执行的sql文本
 * @param {JSON} params 输入参数
 * @param {JSON} func 表示一个回调函数的JSON对象,如下所示:
 * {
    error:function(err){
        console.log(err);
    },
    columns:function(columns){
        console.log(columns);
    },
    row:function(row){
        console.log(row);
    },
    done:function(affected){
        console.log(affected);
    }
 */
sql.queryViaStreamWithParams=function(sqltext,params,func){
    try{
        config.stream=true;

        mssql.connect(config,function(err){
            if(err)
                func.error(err);
            else{
                var request=new mssql.Request();
                request.stream=true;// You can set streaming differently for each request
                if(params){
                    for(var index in params){
                        request.input(index,params[index].sqlType,params[index].inputValue);
                    }
                }

                request.query(sqltext);

                request.on(‘recordset‘,function(columns){
                    //columns是一个JSON对象,表示 返回数据表的整个结构,包括每个字段名称以及每个字段的相关属性
                    //如下所示
                    /*
                    { id:
                    { index: 0,
                        name: ‘id‘,
                        length: undefined,
                        type: [sql.Int],
                        scale: undefined,
                        precision: undefined,
                        nullable: false,
                        caseSensitive: false,
                        identity: true,
                        readOnly: true },
                        name:
                        { index: 1,
                            name: ‘name‘,
                            length: 100,
                            type: [sql.NVarChar],
                            scale: undefined,
                            precision: undefined,
                            nullable: true,
                            caseSensitive: false,
                            identity: false,
                            readOnly: false },
                        Pwd:
                        { index: 2,
                            name: ‘Pwd‘,
                            length: 200,
                            type: [sql.VarChar],
                            scale: undefined,
                            precision: undefined,
                            nullable: true,
                            caseSensitive: false,
                            identity: false,
                            readOnly: false } }
                    */
                    func.columns(columns);
                });

                request.on(‘row‘, function(row) {
                    //row是一个JSON对象,表示 每一行的数据,包括字段名和字段值
                    //如 { id: 1004, name: ‘jsw‘, Pwd: ‘12345678‘ }
                    //如果行数较多,会多次进入该方法,每次只返回一行
                    func.row(row);
                });

                request.on(‘error‘, function(err) {
                    //err是一个JSON对象,表示 错误信息
                    //如下所示:
                    /*
                    { [RequestError: Incorrect syntax near the keyword ‘from‘.]
                        name: ‘RequestError‘,
                            message: ‘Incorrect syntax near the keyword \‘from\‘.‘,
                        code: ‘EREQUEST‘,
                        number: 156,
                        lineNumber: 1,
                        state: 1,
                    class: 15,
                        serverName: ‘06-PC‘,
                        procName: ‘‘ }
                    */
                    func.error(err);
                });

                request.on(‘done‘, function(affected) {
                    //affected是一个数值,表示 影响的行数
                    //如 0
                    //该方法是最后一个执行
                    func.done(affected);
                });
            }
        });

        mssql.on(‘error‘,func.error);
    }catch(e){
        func.error(e);
    }finally{
        config.stream=false;
    }
};

/**
 * 如果需要处理大批量的数据行,通常应该使用流
 * @param {string} sqltext 需要执行的sql文本
 * @param {JSON} func 表示一个回调函数的JSON对象,如下所示:
 * {
    error:function(err){
        console.log(err);
    },
    columns:function(columns){
        console.log(columns);
    },
    row:function(row){
        console.log(row);
    },
    done:function(affected){
        console.log(affected);
    }
 */
sql.queryViaStream=function(sqltext,func){
    sql.queryViaStreamWithParams(sqltext,null,func);
};

module.exports=sql;

本篇文章是根据https://www.npmjs.com/package/mssql来写作的,不足之处,请勿见怪,本人新手!

时间: 2024-08-06 07:23:41

Nodejs之mssql模块的封装的相关文章

nodejs:连接数据库SqlServer,mssql模块

现在的数据库越来越多,如mgdb,我比较常用的是mysql,但有一天做项目需要连接SqlServer,就去找了个方法.找了很多无非就mssql模块和node-sqlserver模块,但node-sqlserver好像有很多限制和还要编译,感觉很麻烦,就用了mssql模块.mssql模块还是很简单的,因为,只是想连接SqlServer,所以,并没做太多的的深入,将官方文档上取出最简单的连接部分,有兴趣的人可以继续研究.安装就不说了,直接上代码. 我的SqlServer的名字是john,所以连接是用

nodejs学习(模块的简单了解)

1.模块模块(Module)是nodejs最重要的支柱,开发一个具有一定规范的程序不可能只用一个文件, 通常我们需要把各个功能拆分,封装,然后在组合在一起,模块正是为了现在这种方式而诞 生的.在浏览器的javascript中,脚本模块的拆分和组合通常情况下我们都使用Html的 Script标签来实现,但是nodejs给我们提供了require这个函数来调用其他的模块.-----------------------------------------------------------------

Nodejs的http模块

一.http服务器    我们知道传统的HTTP服务器是由Aphche.Nginx.IIS之类的软件来搭建的,但是Nodejs并不需要,Nodejs提供了http模块,自身就可以用来构建服务器,例如: var http = require("http"); http.createServer(function(req,res) { res.writeHead(200,{ "content-type":"text/plain" }); res.wr

Nodejs中关于模块的总结

关于Nodejs中的模块 概念 Nodejs在ECMAScript的基础上扩展并封装了许多高级特性,如文件访问.网络访问等,使得Nodejs成为一个很好的Web开发平台.基于Nodejs这个平台将Web开发常用的一些功能进行封装,称为模块. 1.系统模块 1. 模块被加载后才能使用,Nodejs提供了全局的函数require加载模块. 1.os模块 获取当前操作系统信息 2.fs模块 文件读写操作 3.path模块 路径处理 2. require加载模块路径 相对路径: 如 ./ 或 ../ 绝

模块的封装之无伤大雅的形式主义

1 //! \brief macro for inheritance 2 #define INHERIT(__TYPE) __TYPE 3 #define INHERIT_EX(__TYPE, __NAME) 4 union { 5 __TYPE; 6 __TYPE __NAME; 7 }; [交流][微知识]模块的封装(三):无伤大雅的形式主义 在前面的讨论中,我们介绍了如何在必要的情况下,利用结构体和联合体在C语言中引入应用所必须的一些面向对象的 特性,例如封装.继承.派生以及覆盖.从功能性

模块的封装之C语言类的继承和派生

[交流][微知识]模块的封装(二):C语言的继承和派生 在模块的封装(一):C语言的封装中,我们介绍了如何使用C语言的结构体来实现一个类的封装,并通过掩码结构体的方式实 现了类成员的保护.这一部分,我们将 在此的基础上介绍C语言类的继承和派生.其实继承和派生是一个动作的两种不同角度的表达 .当我们继承了一个基类而创造了一个新类时,派生的概念就诞生了.派生当然是从基类派生的.派生出来的类当然是继承了基类的 东西.继承和派生不是一对好基友,他们根本就是一个动作的两种不同的说法,强调动作的起始点的时候

模块的封装之C语言类的封装

[微知识]模块的封装(一):C语言类的封装 是的,你没有看错,我们要讨论的是C语言而不是C++语言中类的封装.在展开知识点之前,我首先要 重申两点: 1.面向对象是一种思想,基本与所用的语言是无关的.当你心怀面向对象时,即使使用QBasic也能写 出符合面向对象思想的代码,更不要说C语言了.举一个反例,很多人初学C++的时候,并没有掌 握面向对象的思想,活生生的把类当结构体来使用的也不在少数吧. 2.面向对象的最基本的出发点是“将数据以及处理数据的方法封装在一起”,至于继承.派生.多态之类 的则

nodejs的require模块及路径

在nodejs中,模块大概可以分为核心模块和文件模块. 核心模块是被编译成二进制代码,引用的时候只需require表示符即可,如(require('net')). 文件模块,则是指js文件.json文件或者是.node文件.在引用文件模块的时候后要加上文件的路径:/-/-/xxx.js表示绝对路径../xxx.js表示相对路径(同一文件夹下的xxx.js),../表示上一级目录.如果既不加/-/.../又不加./的话,则该模块要么是核心模块,要么是从一个node_modules文件夹加载. 对于

如何为编程爱好者设计一款好玩的智能硬件(八)——LCD1602点阵字符型液晶显示模块驱动封装(中)

六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计一款好玩的智能硬件(七)——LCD1602点阵字符型液晶显示模块驱动封装(上) 八.LCD1602点阵字符型液晶显示模块驱动封装(中) 已经有好一阵子没写了,一方面是因为最近闲杂的事特多,另一方面(主要方面)是因为我卡在了LCD1602驱动的权衡上面——总共3个控制线和一个8位并行的数据线,放在51