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來寫作的,不足之處,請勿見怪,本人新手!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM