Nodejs连接sqlserver数据层封装
发布时间:2020-12-12 13:16:01 所属栏目:MsSql教程 来源:网络整理
导读:? ? 关于如何连接sqlserver可以参考上篇nodejs连接sqlserver,这一篇主要是将所有数据库操作封装起来,方便项目调用。 ? ? 思路:所有配置参数写入xml文件,数据库操作封装起来,外部只暴露增删改查方法,方法参数只需要sql语句。 1.nodejs读取xml文件 ? ? no
? ? 关于如何连接sqlserver可以参考上篇nodejs连接sqlserver,这一篇主要是将所有数据库操作封装起来,方便项目调用。 ? ? 思路:所有配置参数写入xml文件,数据库操作封装起来,外部只暴露增删改查方法,方法参数只需要sql语句。 1.nodejs读取xml文件? ? nodejs解析xml文件需要模块libxmljs,安装:nmp install libxmljs ? ? config.xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <root> <mydb driver="SQL Server Native Client 11.0" server="XXX" database="XXX" user="XXX" pwd="XXX"> <table name="FelixTest" /> </mydb> </root> /* Author: Felix.X.Zhang Date: 2014-6-19 Introduction: this module provides you with the operations (read) of xml file. */ //Async Method /* var libxmljs=require('libxmljs'); var fs=require('fs'); var path='./config.xml'; var param=new params(); fs.readFile(path,'utf8',function(err,data) { if (err) throw err; var xmlDoc = libxmljs.parseXmlString(data); // xpath queries var mydb = xmlDoc.get('//mydb'); var table=xmlDoc.get('//mydb//table'); param.mydb_server=mydb.attr('server').value(); param.mydb_database=mydb.attr('database').value(); param.mydb_user=mydb.attr('user').value(); param.mydb_pwd=mydb.attr('pwd').value(); param.table_name=table.attr('name').value(); }); */ function params(){ this.mydb_driver=""; this.mydb_server=""; this.mydb_database=""; this.mydb_user=""; this.mydb_pwd=""; this.table_name=""; } function getParamObj(){ var libxmljs=require('libxmljs'); var fs=require('fs'); var path='./config1.xml'; var param=new params(); var data; try{ data= fs.readFileSync(path,'utf8'); } catch(err){ throw err; } var xmlDoc = libxmljs.parseXmlString(data); var mydb = xmlDoc.get('//mydb'); var table=xmlDoc.get('//mydb//table'); param.mydb_driver=mydb.attr('driver').value(); param.mydb_server=mydb.attr('server').value(); param.mydb_database=mydb.attr('database').value(); param.mydb_user=mydb.attr('user').value(); param.mydb_pwd=mydb.attr('pwd').value(); param.table_name=table.attr('name').value(); //console.log(param.mydb_server+" "+param.table_name); return param; } exports.getParamObj=getParamObj; ? ? 方法很简单,同步读取xml文件后利用libxml模块将data解析为对象,最后将所有属性全部封装到param中。(异步读取参考上面注释段) 2.dbHelper.js/* Author: Felix.X.Zhang Date: 2014-6-21 Introduction: this module provides you with the operations of add,del,update,select. */ //pre-required params var sql = require('msnodesql'); var xml=require('../mymodule/operateXML.js'); var paramObj=xml.getParamObj(); var conn_str="Driver={"+paramObj.mydb_driver+"};Server={"+paramObj.mydb_server+"};Database={"+paramObj.mydb_database+"};uid="+paramObj.mydb_user+";PWD="+paramObj.mydb_pwd+";"; //open database sql.open(conn_str,function (err,conn) { if (err) { console.log(err); } }); function exeScript(sqlscript){ sql.queryRaw(conn_str,sqlscript,results) { if (err) { console.log(err); } else { console.log(results); } }); } function select(sqlscript){ sql.queryRaw(conn_str,results) { if (err) { console.log(err); } else { var txt=toJson(results,paramObj.table_name); var jsonObj=eval("("+txt+")"); console.log(jsonObj); } }); } function del(sqlscript){ exeScript(sqlscript); } function update(sqlscript){ exeScript(sqlscript); } function add(sqlscript){ exeScript(sqlscript); } //convert table to json function toJson(dt,tbName) { var jsonString; if (dt != undefined && dt.rows.length > 0) { var rowLen=dt.rows.length; var colLen=dt.meta.length; jsonString="{"; jsonString+="""+tbName+"":["; for (var i = 0; i < rowLen; i++) { jsonString+="{"; for (var j = 0; j < colLen; j++) { if (j < colLen - 1) { jsonString+=""" + dt.meta[j].name + "":" + """ + dt.rows[i][j]+ "","; } else if (j == colLen - 1) { jsonString+=""" + dt.meta[j].name + "":" + """ + dt.rows[i][j] + """; } } if (i == rowLen - 1) { jsonString+="}"; } else { jsonString+="},"; } } jsonString+="]}"; return jsonString; } return jsonString; } exports.add=add; exports.del=del; exports.update=update; exports.select=select; ? ? 封装的db层也很简单,只有select输出json,其他只执行。 3.测试var db=require('./dbHelper.js'); db.select("select top 10 * from FelixTest"); ? ? 当然了,在实际项目中可以在调用中间加一个bll层,让具体的业务逻辑去生成sql脚本,前台不需要去组装sql,而db层也只要sqlscript。 ? ? PS:博客的代码里很多关键字有的高亮有的不高亮,版式好乱,不知道CSDN是咋了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |