Node.js連接Sql Server 2008及數據層封裝詳解
本文實例講述了Node.js連接Sql Server 2008及數據層封裝。分享給大家供大家參考,具體如下:
最近需要學習Node.js,所以很久沒寫東西了,瘋狂的看了很久的書。有關于Node.js的學習知識,可以參考官網教程WWW.NODEJS.ORG,或者書籍《Node.js權威指南》。這里我記錄一下Node.js連接Sql Server 2008的步驟。
Node.js連接數據庫需要特定的模塊msnodesql,這個模塊需要特定的環(huán)境去生成才可以使用。
前期準備如下:
1.安裝Node.js(官網上下載)
2.安裝node-gyp(安裝好node.js后進入到npm目錄,執(zhí)行npm install node-gyp)
3.安裝python 2.7.x(WWW.PYTHON.ORG上可以下載,注意下載2.7.X版本)
4.安裝Visual C++ 2010 (vs2010中必須有C++模塊,也可以單獨下載Microsoft)
5.安裝SQL Server Native Client 11.0(http://www.microsoft.com/en-us/download/details.aspx?id=29065)
這些全部安裝好后,就搭建好了生成msnodesql模塊的環(huán)境,現(xiàn)在可以去官網的module上下載msnodesql模塊了(注意利用npm intsall msnodesql也可以安裝,但是我是win7 64執(zhí)行這么命令總是不能正確安裝,所以我手動下載了),下載時注意msnodesql的版本和node.js的版本對應。將下載好的msnodesql文件夾復制到node.js的node_modules路徑下,然后生成步驟如下:
1.node-gyp configure
2.node-gyp build 或node-gyp build --debug(前者是release版)
如果生成成功的話,你的msnodesql底下會出現(xiàn)用Visual C++2010生成后的許多工程項目文件。node.js雖然是純javascript代碼,但大部分功能只是封裝成了JS腳本,許多底層的實現(xiàn)其實是C/C++,就好比這個msnodesql模塊,里面就有很多CPP文件,所以需要生成為VC項目。
測試:
新建文件test.js:
var obj=require('msnodesql');
console.log(obj);
coby到node.exe目錄下,執(zhí)行node test
若不出意外則會打印msnodesql的對外接口屬性。若不能正確輸出,則
1.說明msnodesql安裝失敗或者環(huán)境美搭建好,檢查上面的安裝和生成步驟。
2.說明msnodesql路徑沒設置好:node.exe會默認去搜索node_module文件下的模塊,而msnodesql本身也是一個模塊,一個模塊的屬性是由.json來設定的,檢查.json的main屬性,看是否是 "main": "./lib/sql.js",sql.js才是monodesql的入口。
最后附一段操作數據庫的demo作為參考:
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('發(fā)生錯誤');
}
sql.queryRaw(conn_str, "select * from users", function (err, 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文件如下:
<?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>
建立operateXML.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
/*
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, function (err, results) {
if (err) {
console.log(err);
}
else {
console.log(results);
}
});
}
function select(sqlscript){
sql.queryRaw(conn_str, sqlscript, function (err, 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,其他只執(zhí)行。
3.測試
var db=require('./dbHelper.js');
db.select("select top 10 * from FelixTest");
當然了,在實際項目中可以在調用中間加一個bll層,讓具體的業(yè)務邏輯去生成sql腳本,前臺不需要去組裝sql,而db層也只要sqlscript。
希望本文所述對大家nodejs程序設計有所幫助。
相關文章
nodejs清空/刪除指定文件夾下面所有文件或文件夾的方法示例
這篇文章主要介紹了nodejs清空/刪除指定文件夾下面所有文件或文件夾的方法,通過兩個具體案例形式分析了node.js同步刪除文件/文件夾,以及異步刪除文件/文件夾的相關實現(xiàn)技巧,涉及遞歸遍歷與文件判斷、回調等相關操作,需要的朋友可以參考下2023-04-04
nodejs(officegen)+vue(axios)在客戶端導出word文檔的方法
這篇文章主要介紹了nodejs(officegen)+vue(axios)在客戶端導出word文檔的方法,需要的朋友可以參考下2018-07-07
開箱即用的Node.js+Mysql模塊封裝實現(xiàn)詳解
這篇文章主要為大家介紹了開箱即用的Node.js+Mysql模塊封裝實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
淺談node node-sass sass-loader版本對應問題
本文主要介紹了淺談node node-sass sass-loader版本對應問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09

