2012-04-25 132 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