欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Node.js連接Sql Server 2008及數(shù)據(jù)層封裝詳解

 更新時(shí)間:2018年08月27日 09:21:53   作者:喜歡特別冷的冬天下著雪  
這篇文章主要介紹了Node.js連接Sql Server 2008及數(shù)據(jù)層封裝,結(jié)合實(shí)例形式較為詳細(xì)的分析了nodejs連接SQL Server2008數(shù)據(jù)庫(kù)以及針對(duì)數(shù)據(jù)庫(kù)操作方法的封裝與使用相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下

本文實(shí)例講述了Node.js連接Sql Server 2008及數(shù)據(jù)層封裝。分享給大家供大家參考,具體如下:

最近需要學(xué)習(xí)Node.js,所以很久沒(méi)寫東西了,瘋狂的看了很久的書。有關(guān)于Node.js的學(xué)習(xí)知識(shí),可以參考官網(wǎng)教程WWW.NODEJS.ORG,或者書籍《Node.js權(quán)威指南》。這里我記錄一下Node.js連接Sql Server 2008的步驟。

Node.js連接數(shù)據(jù)庫(kù)需要特定的模塊msnodesql,這個(gè)模塊需要特定的環(huán)境去生成才可以使用。

前期準(zhǔn)備如下:

1.安裝Node.js(官網(wǎng)上下載)
2.安裝node-gyp(安裝好node.js后進(jìn)入到npm目錄,執(zhí)行npm install node-gyp)
3.安裝python 2.7.x(WWW.PYTHON.ORG上可以下載,注意下載2.7.X版本)
4.安裝Visual C++ 2010 (vs2010中必須有C++模塊,也可以單獨(dú)下載Microsoft)
5.安裝SQL Server Native Client 11.0(http://www.microsoft.com/en-us/download/details.aspx?id=29065

這些全部安裝好后,就搭建好了生成msnodesql模塊的環(huán)境,現(xiàn)在可以去官網(wǎng)的module上下載msnodesql模塊了(注意利用npm intsall msnodesql也可以安裝,但是我是win7 64執(zhí)行這么命令總是不能正確安裝,所以我手動(dòng)下載了),下載時(shí)注意msnodesql的版本和node.js的版本對(duì)應(yīng)。將下載好的msnodesql文件夾復(fù)制到node.js的node_modules路徑下,然后生成步驟如下:

1.node-gyp configure

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

如果生成成功的話,你的msnodesql底下會(huì)出現(xiàn)用Visual C++2010生成后的許多工程項(xiàng)目文件。node.js雖然是純javascript代碼,但大部分功能只是封裝成了JS腳本,許多底層的實(shí)現(xiàn)其實(shí)是C/C++,就好比這個(gè)msnodesql模塊,里面就有很多CPP文件,所以需要生成為VC項(xiàng)目。

測(cè)試:

新建文件test.js:

var obj=require('msnodesql');
console.log(obj);

coby到node.exe目錄下,執(zhí)行node test

若不出意外則會(huì)打印msnodesql的對(duì)外接口屬性。若不能正確輸出,則

1.說(shuō)明msnodesql安裝失敗或者環(huán)境美搭建好,檢查上面的安裝和生成步驟。

2.說(shuō)明msnodesql路徑?jīng)]設(shè)置好:node.exe會(huì)默認(rèn)去搜索node_module文件下的模塊,而msnodesql本身也是一個(gè)模塊,一個(gè)模塊的屬性是由.json來(lái)設(shè)定的,檢查.json的main屬性,看是否是 "main": "./lib/sql.js",sql.js才是monodesql的入口。

最后附一段操作數(shù)據(jù)庫(kù)的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ā)生錯(cuò)誤');
    }
    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數(shù)據(jù)層封裝

前面簡(jiǎn)單介紹了nodejs連接sqlserver,接下來(lái)介紹將所有數(shù)據(jù)庫(kù)操作封裝起來(lái),方便項(xiàng)目調(diào)用的方法。

思路:所有配置參數(shù)寫入xml文件,數(shù)據(jù)庫(kù)操作封裝起來(lái),外部只暴露增刪改查方法,方法參數(shù)只需要sql語(yǔ)句。

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;

方法很簡(jiǎn)單,同步讀取xml文件后利用libxml模塊將data解析為對(duì)象,最后將所有屬性全部封裝到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層也很簡(jiǎn)單,只有select輸出json,其他只執(zhí)行。

3.測(cè)試

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

當(dāng)然了,在實(shí)際項(xiàng)目中可以在調(diào)用中間加一個(gè)bll層,讓具體的業(yè)務(wù)邏輯去生成sql腳本,前臺(tái)不需要去組裝sql,而db層也只要sqlscript。

希望本文所述對(duì)大家nodejs程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • nodejs清空/刪除指定文件夾下面所有文件或文件夾的方法示例

    nodejs清空/刪除指定文件夾下面所有文件或文件夾的方法示例

    這篇文章主要介紹了nodejs清空/刪除指定文件夾下面所有文件或文件夾的方法,通過(guò)兩個(gè)具體案例形式分析了node.js同步刪除文件/文件夾,以及異步刪除文件/文件夾的相關(guān)實(shí)現(xiàn)技巧,涉及遞歸遍歷與文件判斷、回調(diào)等相關(guān)操作,需要的朋友可以參考下
    2023-04-04
  • 在node中使用jwt簽發(fā)與驗(yàn)證token的方法

    在node中使用jwt簽發(fā)與驗(yàn)證token的方法

    這篇文章主要介紹了在node中使用jwt簽發(fā)與驗(yàn)證token的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • nodejs(officegen)+vue(axios)在客戶端導(dǎo)出word文檔的方法

    nodejs(officegen)+vue(axios)在客戶端導(dǎo)出word文檔的方法

    這篇文章主要介紹了nodejs(officegen)+vue(axios)在客戶端導(dǎo)出word文檔的方法,需要的朋友可以參考下
    2018-07-07
  • nodejs中全局變量的實(shí)例解析

    nodejs中全局變量的實(shí)例解析

    本文主要介紹了nodejs中全局變量的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • 用node.js寫一個(gè)jenkins發(fā)版腳本

    用node.js寫一個(gè)jenkins發(fā)版腳本

    這篇文章主要介紹了用node.js寫一個(gè)jenkins發(fā)版腳本,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 使用Node操作MySQL的兩種方式

    使用Node操作MySQL的兩種方式

    本文將介紹如何在?Node.js?應(yīng)用中使用?mysql2?和?TypeORM?兩種方式操作?MySQL?數(shù)據(jù)庫(kù),文中通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • 在Ubuntu系統(tǒng)上安裝Node.JS的教程

    在Ubuntu系統(tǒng)上安裝Node.JS的教程

    這篇文章主要介紹了在Ubuntu系統(tǒng)上安裝Node.JS的教程,Node.JS的高性能V8解釋器運(yùn)行及異步機(jī)制為其帶來(lái)了巨大的人氣,需要的朋友可以參考下
    2015-10-10
  • 開(kāi)箱即用的Node.js+Mysql模塊封裝實(shí)現(xiàn)詳解

    開(kāi)箱即用的Node.js+Mysql模塊封裝實(shí)現(xiàn)詳解

    這篇文章主要為大家介紹了開(kāi)箱即用的Node.js+Mysql模塊封裝實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • nodejs實(shí)現(xiàn)文件或文件夾上傳功能的代碼示例

    nodejs實(shí)現(xiàn)文件或文件夾上傳功能的代碼示例

    在平常的工作中,經(jīng)常會(huì)遇到需要將本地項(xiàng)目文件同步到遠(yuǎn)端服務(wù)器的情況,所以每次遇到都需要考慮如何將文件上傳到服務(wù)器上,所以本文就給大家介紹一下nodejs實(shí)現(xiàn)文件或文件夾上傳功能,需要的朋友可以參考下
    2023-08-08
  • 淺談node node-sass sass-loader版本對(duì)應(yīng)問(wèn)題

    淺談node node-sass sass-loader版本對(duì)應(yīng)問(wèn)題

    本文主要介紹了淺談node node-sass sass-loader版本對(duì)應(yīng)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評(píng)論