微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Node.js连接Sql Server 2008及数据层封装详解

本文实例讲述了Node.js连接Sql Server 2008及数据层封装。分享给大家供大家参考,具体如下:

最近需要学习Node.js,所以很久没写东西了,疯狂的看了很久的书。有关于Node.js的学习知识,可以参考官网教程》。这里我记录一下Node.js连接Sql Server 2008的步骤。

Node.js连接数据库需要特定的模块msnodesql,这个模块需要特定的环境去生成才可以使用。

前期准备如下:

1.安装Node.js(官网上下载) 2.安装node-gyp(安装好node.js后进入到npm目录,执行npm install node-gyp) 3.安装python 2.7.x(sql Server Native Client 11.0(

这些全部安装好后,就搭建好了生成msnodesql模块的环境,现在可以去官网的module上下载msnodesql模块了(注意利用npm intsall msnodesql也可以安装,但是我是win7 64执行这么命令总是不能正确安装,所以我手动下载了),下载时注意msnodesql的版本和node.js的版本对应。将下载好的msnodesql文件夹复制到node.js的node_modules路径下,然后生成步骤如下:

1.node-gyp configure

2.node-gyp build node-gyp build --debug(前者是release版)

如果生成成功的话,你的msnodesql底下会出现用Visual C++2010生成后的许多工程项目文件。node.js虽然是纯javascript代码,但大部分功能只是封装成了JS脚本,许多底层的实现其实是C/C++,就好比这个msnodesql模块,里面就有很多CPP文件,所以需要生成为VC项目。

测试:

新建文件test.js:

rush:js;"> var obj=require('msnodesql'); console.log(obj);

coby到node.exe目录下,执行node test

若不出意外则会打印msnodesql的对外接口属性。若不能正确输出,则

1.说明msnodesql安装失败或者环境美搭建好,检查上面的安装和生成步骤。

2.说明msnodesql路径没设置好:node.exe会认去搜索node_module文件下的模块,而msnodesql本身也是一个模块,一个模块的属性是由.json来设定的,检查.json的main属性,看是否是 "main": "./lib/sql.js",sql.js才是monodesql的入口。

最后附一段操作数据库的demo作为参考:

rush:js;"> var sql=require('msnodesql'); var conn_str="Driver={sql Server Native Client 11.0};Server={.};Database={nodetest};uid=sa;PWD=123456;"; sql.open(conn_str,function (err,conn) { if (err) { console.log('发生错误'); } sql.queryRaw(conn_str,"select * from users",results) { if (err) { console.log(err); } else { for (var i = 0; i < results.rows.length; i++) { console.log(results.rows[i][0] + results.rows[i][1]); } } }) })

Nodejs连接sqlserver数据层封装

前面简单介绍了nodejs连接sqlserver,接下来介绍将所有数据库操作封装起来,方便项目调用方法

思路:所有配置参数写入xml文件数据库操作封装起来,外部只暴露增删改查方法方法参数只需要sql语句。

1.nodejs读取xml文件

nodejs解析xml文件需要模块libxmljs,安装:nmp install libxmljs

config.xml文件如下:

rush:xml;"> sql Server Native Client 11.0" server="XXX" database="XXX" user="XXX" pwd="XXX">

建立operateXML.js:

rush:js;"> /* 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

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.测试

rush:js;"> var db=require('./dbHelper.js'); db.select("select top 10 * from FelixTest");

当然了,在实际项目中可以在调用中间加一个bll层,让具体的业务逻辑去生成sql脚本,前台不需要去组装sql,而db层也只要sqlscript。

希望本文所述对大家nodejs程序设计有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐