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