2012-04-25 174 views
23

該問題重複了一些較舊的問題,但從那時起事情可能已經改變。從Node.js連接到SQL Server數據庫

是否有一些官方支持從Node.js連接到SQL Server(例如MS的官方庫)?或者至少有一些維護良好的適合生產級應用的第三方庫?

我們通常使用ASP.NET MVC/SQL Server的組合,但目前我有一個任務,其中express/Node.js似乎更合適(我想玩新的東西),所以問題是我們是否可以依賴Node.js和SQL Server的交互。

UPD:它看起來,微軟已經在去年發佈的官方驅動程序:https://github.com/WindowsAzure/node-sqlserver

+0

我一直在尋找一個這樣的解決方案現在幾周...感謝您添加問題。現在我還使用瘦MVC應用程序來處理SQL連接,但我不喜歡它。令人煩惱的是,我能找到的所有答案指向相同的非工作模塊。 – 2012-04-28 07:57:25

+1

@MarcelPopescu https://github.com/pekim/tedious似乎爲我工作,但有以下限制:它不支持事務(即使那些沒有明確簽發但在存儲過程中發生的事務),它不支持過程返回多個結果集。無論如何,返回多個結果集的過程應該被重寫。但沒有交易的生活正在將Node.js + MSSQL的使用限制在一個簡單的幾乎透明的前端(謝天謝地,這正是我寫的)。 – penartur 2012-05-01 11:53:03

+0

@MarcelPopescu我希望有一天MS會爲Node發佈官方的MSSQL驅動程序,就像他們對Azure平臺的其他功能所做的一樣。雖然當時我可能會離開現在的僱主,並會使用舊的Postgres:D – penartur 2012-05-01 11:55:34

回答

13

我不知道你看到的MS SQL Modules for Node JS

此列表共享使用一個可能的話後,你的經驗。

好運

+2

'tsqlftw'似乎不活躍; 'node-mssql'不再可用; '單調乏味'取決於'iconv',它使用'node-waf',它在Windows上不可用,所以看起來我只剩下'tds'的唯一選擇。至少今天我能夠連接到數據庫,但我還沒有執行任何查詢。 – penartur 2012-04-25 17:01:44

+0

:o,祝你好運! – Futur 2012-04-26 07:30:37

+1

順便說一下,'iconv'只是'繁瑣'的可選項,所以目前我正在玩'乏味'(儘管沒有認真的事情)。 'tds'不適用於我:https://github.com/cretz/node-tds/issues/25 – penartur 2012-04-26 17:23:38

2

有在NPM模塊稱爲mssqlhelper

您可以通過npm i mssqlhelper

它安裝到您的項目連接和執行查詢的示例:

var db = require('./index'); 

db.config({ 
    host: '192.168.1.100' 
    ,port: 1433 
    ,userName: 'sa' 
    ,password: '123' 
    ,database:'testdb' 
}); 

db.query(
    'select @Param1 Param1,@Param2 Param2' 
    ,{ 
     Param1: { type : 'NVarChar', size: 7,value : 'myvalue' } 
     ,Param2: { type : 'Int',value : 321 } 
    } 
    ,function(res){ 
     if(res.err)throw new Error('database error:'+res.err.msg); 
     var rows = res.tables[0].rows; 
     for (var i = 0; i < rows.length; i++) { 
      console.log(rows[i].getValue(0),rows[i].getValue('Param2')); 
     } 
    } 
); 

您可以閱讀更多關於它的信息在這裏:https://github.com/play175/mssqlhelper

:O)

+3

謝謝您的回答,但由一位開發人員維護的不到一個月的時間,包含中文評論意見並不能爲您提供可靠的生產級圖書館印象。另外,從代碼的角度來看,這個'mssqlhelper'實際上只是上面關於這個問題的提到的'tds'庫中的一個簡單的包裝層。我想聽聽可靠的維護良好的庫(理想情況下來自Microsoft本身),而不是關於知名庫的精簡包裝。 – penartur 2012-04-25 07:17:57

+0

順便說一下,作者似乎還盜用了他們的mssqlhelper的TDS包(https://github.com/cretz/node-tds/tree/master/lib)源代碼,假裝* play175 *自己寫的。 – penartur 2012-04-25 07:21:35

6

我們剛剛發佈了預覽驅動程序使用Node.js語言爲SQL Server連接。你可以在這裏找到它: Introducing the Microsoft Driver for Node.JS for SQL Server

驅動程序支持回調(在這裏,我們連接到本地SQL Server實例):

// Query with explicit connection 
var sql = require('node-sqlserver'); 
var conn_str = "Driver={SQL Server Native Client 11.0};Server=(local);Database=AdventureWorks2012;Trusted_Connection={Yes}"; 

sql.open(conn_str, function (err, conn) { 
    if (err) { 
     console.log("Error opening the connection!"); 
     return; 
    } 
    conn.queryRaw("SELECT TOP 10 FirstName, LastName FROM Person.Person", function (err, results) { 
     if (err) { 
      console.log("Error running query!"); 
      return; 
     } 
     for (var i = 0; i < results.rows.length; i++) { 
      console.log("FirstName: " + results.rows[i][0] + " LastName: " + results.rows[i][1]); 
     } 
    }); 
}); 

或者,您可以使用事件(在這裏,我們連接到SQL Azure的又名的Windows Azure SQL數據庫):

// Query with streaming 
var sql = require('node-sqlserver'); 
var conn_str = "Driver={SQL Server Native Client 11.0};Server={tcp:servername.database.windows.net,1433};UID={username};PWD={Password1};Encrypt={Yes};Database={databasename}"; 

var stmt = sql.query(conn_str, "SELECT FirstName, LastName FROM Person.Person ORDER BY LastName OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY"); 
stmt.on('meta', function (meta) { console.log("We've received the metadata"); }); 
stmt.on('row', function (idx) { console.log("We've started receiving a row"); }); 
stmt.on('column', function (idx, data, more) { console.log(idx + ":" + data);}); 
stmt.on('done', function() { console.log("All done!"); }); 
stmt.on('error', function (err) { console.log("We had an error :-(" + err); }); 

如果您遇到任何問題,請在Github上提交一個問題:https://github.com/windowsazure/node-sqlserver/issues

+1

+1(並且仍然活躍 - 耶!),但這是如何幫助我們鎖定到Visual Studio/.NET相關產品?你的營銷計劃......他們混淆了我。 – 2013-04-04 21:46:49

+1

你如何關閉數據庫連接? – gjw80 2013-11-05 13:45:55

+0

偉大的問題。連接如何處理? – 2014-01-18 08:33:02

0

msnodesql正在抓緊偉大的我。這裏是一個樣本:

var mssql = require('msnodesql'), 
    express = require('express'), 
    app = express(), 
    nconf = require('nconf') 

nconf.env() 
    .file({ file: 'config.json' }); 

var conn = nconf.get("SQL_CONN"); 
var conn_str = "Driver={SQL Server Native Client 11.0};Server=server.name.here;Database=Product;Trusted_Connection={Yes}"; 

app.get('/api/brands', function(req, res){ 
    var data = []; 
    var jsonObject = {};  

    mssql.open(conn_str, function (err, conn) { 
     if (err) { 
      console.log("Error opening the connection!"); 
      return; 
     } 
     conn.queryRaw("dbo.storedproc", function (err, results) { 
     if(err) { 
        console.log(err); 
        res.send(500, "Cannot retrieve records."); 
       } 
     else { 
      //res.json(results); 

      for (var i = 0; i < results.rows.length; i++) { 
       var jsonObject = new Object() 
       for (var j = 0; j < results.meta.length; j++) { 

        paramName = results.meta[j].name; 
        paramValue = results.rows[i][j]; 
        jsonObject[paramName] = paramValue; 

        } 
        data.push(jsonObject); //This is a js object we are jsonizing not real json until res.send    
      } 

       res.send(data); 

      }  
     }); 
    }); 
}); 
19

這主要是爲未來的讀者。由於問題(至少標題)側重於「從節點js連接到sql server數據庫」,所以我想關於「mssql」節點模塊。

此刻,我們有一個NodeJs(「msnodesql」)的Microsoft SQL Server驅動程序的穩定版本可在此處獲得:https://www.npmjs.com/package/msnodesql。雖然它與Microsoft SQL Server數據庫(比任何其他節點模塊)本地集成做得很好,但還有幾件事值得注意。

「msnodesql」需要在主機上安裝一些先決條件(如python,VC++,SQL本機客戶端等)。這使得你的「節點」應用程序「Windows」依賴。如果你對基於「Windows」的部署很好,使用「msnodesql」是最好的。

另一方面,還有一個名爲「mssql」的模塊(可在此處獲得https://www.npmjs.com/package/mssql),它可以根據配置使用「單調乏味」或「msnodesql」。雖然這個模塊可能不如「msnodesql」那麼全面,但它幾乎解決了大部分需求。 https://www.youtube.com/watch?v=MLcXfRH1YzE

針對上述視頻的源代碼是:

如果你想開始與「MSSQL」,我碰到一個簡單和直接的視頻,這也解釋了關於這裏使用的NodeJS連接到Microsoft SQL Server數據庫來可在這裏:http://techcbt.com/Post/341/Node-js-basic-programming-tutorials-videos/how-to-connect-to-microsoft-sql-server-using-node-js

以防萬一,如果上面的鏈接不工作,我包括源代碼在這裏:

var sql = require("mssql"); 
 

 
var dbConfig = { 
 
    server: "localhost\\SQL2K14", 
 
    database: "SampleDb", 
 
    user: "sa", 
 
    password: "sql2014", 
 
    port: 1433 
 
}; 
 

 
function getEmp() { 
 
    var conn = new sql.Connection(dbConfig); 
 
    
 
    conn.connect().then(function() { 
 
     var req = new sql.Request(conn); 
 
     req.query("SELECT * FROM emp").then(function (recordset) { 
 
      console.log(recordset); 
 
      conn.close(); 
 
     }) 
 
     .catch(function (err) { 
 
      console.log(err); 
 
      conn.close(); 
 
     });   
 
    }) 
 
    .catch(function (err) { 
 
     console.log(err); 
 
    }); 
 

 
    //--> another way 
 
    //var req = new sql.Request(conn); 
 
    //conn.connect(function (err) { 
 
    // if (err) { 
 
    //  console.log(err); 
 
    //  return; 
 
    // } 
 
    // req.query("SELECT * FROM emp", function (err, recordset) { 
 
    //  if (err) { 
 
    //   console.log(err); 
 
    //  } 
 
    //  else { 
 
    //   console.log(recordset); 
 
    //  } 
 
    //  conn.close(); 
 
    // }); 
 
    //}); 
 

 
} 
 

 
getEmp();

上面的代碼很自我解釋。我們定義數據庫連接參數(在「dbConfig」JS對象中),然後使用「連接」對象連接到SQL Server。爲了執行「SELECT」語句,在這種情況下,它使用內部與「Connection」對象一起工作的「Request」對象。該代碼解釋了使用基於「承諾」和「回調」的執行的兩種風格。

上面的源代碼只解釋了連接到sql server數據庫和執行SELECT查詢。您可以輕鬆地把它帶到一個新的水平按照提供的「MSSQL」節點的文件:https://www.npmjs.com/package/mssql

UPDATE: 有一個新的視頻使用純Node.js的REST標準,它確實CRUD操作(與Microsoft SQL服務器)在這裏:https://www.youtube.com/watch?v=xT2AvjQ7q9E。這是一個夢幻般的視頻,從頭開始解釋一切(它已經得到了很多代碼,它不會那麼愉快地解釋/複製整個代碼在這裏)

+0

我使用節點mssql,它很棒,源回購是:https://github.com/patriksimek/node-mssql – Kalamarico 2016-06-21 12:55:20

+0

視頻鏈接真的很有幫助。 https://www.youtube.com/watch?v=MLcXfRH1YzE – 2016-11-03 22:09:23

+1

我跟着這個,但我不斷收到「sql.connection到一個構造函數」。 – cleverpaul 2017-06-21 06:31:23