Nodejs接続sqlserverデータ層パッケージ

5837 ワード

どのように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>
operate XML.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層も簡単で、jsonを出力するのはselectだけで、他は実行します.
3.テスト
var db=require('./dbHelper.js');
db.select("select top 10 * from FelixTest");
    もちろん、実際のプロジェクトでは呼び出し中にbll層を追加して、具体的な業務ロジックでsqlスクリプトを生成してもいいです.フロントはsqlを組み立てる必要がありません.db層もsqlscriptだけです.
    PS:ブログのコードの中には多くのキーワードがあります.ハイライトが高くない、レイアウトが乱れています.CSDNはどうなっているか分かりません.