【问题标题】:Connect to SQL Server database from Node.js从 Node.js 连接到 SQL Server 数据库
【发布时间】:2012-05-05 18:37:42
【问题描述】:

这个问题重复了一些旧问题,但从那时起事情可能已经改变了。

是否有一些官方支持从 Node.js 连接到 SQL Server(例如 MS 的官方库)?或者至少是一些适用于生产级应用程序的维护良好的第三方库?

我们通常使用 ASP.NET MVC/SQL Server 组合,但目前我有一个任务,express/Node.js 似乎更合适(我想玩一些新的东西),所以问题是我们是否可以依赖 Node.js 和 SQL Server 交互。

UPD:看来微软终于发布了官方驱动:https://github.com/WindowsAzure/node-sqlserver

【问题讨论】:

  • 几周以来我一直在寻找解决方案...感谢您添加问题。现在我也在使用一个瘦 MVC 应用程序来处理 SQL 连接,但我不喜欢它。我能找到的所有答案都指向相同的非工作模块,这很烦人。
  • @MarcelPopescu github.com/pekim/tedious 似乎对我有用,但有以下限制:它不支持事务(即使那些不是您明确发出但发生在存储过程中的事务),也不支持过程返回多个结果集。返回多个结果集的过程无论如何都应该重写恕我直言;但是没有事务的生活将 Node.js+MSSQL 的使用限制在一个简单的近乎透明的前端(谢天谢地,这就是我正在写的)。
  • @MarcelPopescu 其实MS刚刚发布了官方的MSSQL驱动:github.com/WindowsAzure/node-sqlserver
  • @MarcelPopescu BTW,我越看越不喜欢。它似乎写得很糟糕,并且在设计时没有考虑到节点生态系统(例如,他们实现了自己的连接池)。

标签: sql-server node.js


【解决方案1】:

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)

【讨论】:

  • 感谢您的回答,但是不到一个月,由单个开发人员维护,包含中文的 cmets 并没有给人留下可靠的生产级库的印象。此外,查看代码,似乎这个mssqlhelper 实际上只是在之前的问题中提到的tds 库之上的一个薄包装层。我想了解可靠且维护良好的库(理想情况下,来自 Microsoft 本身),而不是知名库的精简包装器。
  • 而且,顺便说一下,好像作者还盗用了他们的mssqlhelper的TDS包(github.com/cretz/node-tds/tree/master/lib)源代码,假装是play175自己写的.
【解决方案2】:

我不确定你有没有看到这个MS SQL Modules for Node JS列表

如果可能的话,分享您使用后的体验。

祝你好运

【讨论】:

  • tsqlftw 似乎处于非活动状态; node-mssql 不再可用; tedious 取决于iconv,它使用node-waf,这在Windows 上不可用,所以看来我只能选择tds。至少今天我能够用它连接到数据库,尽管我还没有执行任何查询。
  • 顺便说一句,iconv 仅对tedious 是可选的,所以目前我正在玩tedious(虽然还没有做任何严肃的事情)。 tds 对我不起作用:github.com/cretz/node-tds/issues/25
  • 我现在正在使用tedious,但是,当我有空闲时间时,我会尝试迁移到最近发布的MS官方驱动程序:github.com/WindowsAzure/node-sqlserver
  • MS 的官方驱动程序似乎需要很多,包括 Visual Studio - 所以似乎无法在 Linux 上运行(?!)。 Tedious 有很好的文档和很好的事件模型。现在在 Windows 上玩 Tedious(没有 Truestedconnection,顺便说一句)。
【解决方案3】:

我们刚刚发布了用于 SQL Server 连接的 Node.JS 预览驱动程序。你可以在这里找到它: 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(并且仍然有效 - 耶!)但这如何帮助我们锁定与 Visual Studio/.NET 相关的产品?你的营销计划……让我很困惑。
  • 如何关闭数据库连接?
  • 好问题。如何处理连接?
  • open返回的连接对象有一个close函数定义为function (immediately, callback),其中immediately是可选的。因此,在上面的第一个示例中,如果您希望它在关闭之前完成任何操作,您可以调用 conn.close(callback),或者在不等待的情况下立即关闭 conn.close(true, callback)
  • 您应该提到此驱动程序是仅限Windows。很重要。此外,在没有提及 NPM 安装行的情况下开始一篇关于使用库的博文也很奇怪。
【解决方案4】:

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);

            }       
        });
    });
});

【讨论】:

    【解决方案5】:

    这主要是为未来的读者准备的。由于问题(至少标题)集中在“从节点 js 连接到 sql server 数据库”,我想介绍一下“mssql”节点模块。

    目前,我们有一个稳定版本的用于 NodeJs 的 Microsoft SQL Server 驱动程序(“msnodesql”),可在此处获取: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”那么全面,但它几乎解决了大部分需求。

    如果您想从“mssql”开始,我看到了一个简单直接的视频,它解释了如何使用 NodeJs 连接到 Microsoft SQL Server 数据库:https://www.youtube.com/watch?v=MLcXfRH1YzE

    以上视频的源代码在这里: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();

    上面的代码很容易解释。我们定义了 db 连接参数(在“dbConfig”JS 对象中),然后使用“Connection”对象连接到 SQL Server。为了执行“SELECT”语句,在这种情况下,它使用“Request”对象,该对象在内部与“Connection”对象一起工作。该代码解释了使用基于“承诺”和“回调”的执行的两种风格。

    上面的源代码只解释了连接到 sql server 数据库和执行一个 SELECT 查询。您可以通过以下“mssql”节点的文档轻松将其提升到一个新的水平:https://www.npmjs.com/package/mssql

    更新: 这里有一个使用纯 Node.js REST 标准(使用 Microsoft SQL Server)进行 CRUD 操作的新视频:https://www.youtube.com/watch?v=xT2AvjQ7q9E。这是一个很棒的视频,它从头开始解释一切(它有很多代码,在这里解释/复制整个代码不会那么令人愉快)

    【讨论】:

    • 我用的是node-mssql,非常棒,源码是:github.com/patriksimek/node-mssql
    • 我已经关注了这个,但我不断收到“sql.connection in to a constructor”。
    • 你太棒了。
    【解决方案6】:
    //start the program
    var express = require('express');
    var app = express();
    
    app.get('/', function (req, res) {
    
        var sql = require("mssql");
    
        // config for your database
        var config = {
            user: 'datapullman',
            password: 'system',
            server: 'localhost', 
            database: 'chat6' 
        };
    
        // connect to your database
        sql.connect(config, function (err) {
    
            if (err) console.log(err);
    
            // create Request object
            var request = new sql.Request();
    
            // query to the database and get the records
    
            request.query("select * From emp", function (err, recordset) {            
                if  (err) console.log(err)
    
                // send records as a response
                res.send(recordset);
    
            });
        });
    });
    
    var server = app.listen(5000, function () {
        console.log('Server is running..');
    });
    

    //在数据库中创建一个表为emp(我已创建为chat6)

    // programs ends here
    

    //保存为 app.js 并作为节点运行 app.js //在浏览器中以 localhost:5000 的身份打开

    【讨论】:

      猜你喜欢
      • 2014-10-30
      • 1970-01-01
      • 2019-09-10
      • 2013-07-08
      • 1970-01-01
      • 2016-05-25
      相关资源
      最近更新 更多