节点SQL Server mssql流

时间:2014-12-11 22:58:56

标签: sql sql-server node.js streaming

我是节点新手,正在使用mssql以连接到SQL Server。是否有人能够帮助我提供更全面的mssql流媒体示例。我觉得git的例子模糊不清,不知道从哪里开始。非常感谢任何帮助。

var sql = require('mssql'); 

var config = {
    user: '...',
    password: '...',
    server: 'localhost', // You can use 'localhost\\instance' to connect to named instance
    database: '...',
    stream: true, 

    options: {// Use this if you're on Windows Azure
    }
}

sql.connect(config, function(err) {


    var request = new sql.Request();
    request.stream = true; // You can set streaming differently for each request
    request.query('select * from verylargetable'); // or request.execute(procedure);

    request.on('recordset', function(columns) {
        // Emitted once for each recordset in a query
    });

    request.on('row', function(row) {
        // Emitted for each row in a recordset
    });

    request.on('error', function(err) {
        // May be emitted multiple times
    });

    request.on('done', function(returnValue) {
        // Always emitted as the last one
    });
});

2 个答案:

答案 0 :(得分:4)

我要去 Holy Necro 这篇文章,因为我今天遇到了同样的问题,并希望留下一些可能对未来有帮助的东西。

根据ExpressJs documentation,流式传输任何大型数据的正确方法是write偶然发送响应,flush响应,然后完成,end回复。

NPM上的{p> mssql声明您可以订阅一些活动,例如您的文档摘录中列出的活动。这很棒,但你如何整合这两个?

好吧,我提出了以下解决方案(可能不是最好的,但是嘿,它有效)

我们的想法是从SQL记录中流式传输数据以进行记录,但只能将数据以50个批次的形式刷新到调用者。完成后,结束响应。

我还需要Array格式,所以我必须构建开头,分隔符并为此结束自己。

exports.listAllRecordsInReallyBigDataTable = (req, res) => {
  const config = {
    ...
  }

  sql.connect(config, () => {
    res.setHeader('Cache-Control', 'no-cache');

    const request = new sql.Request();
    request.stream = true;
    request.query('select * from myBigTableOrView');

    let rowCount = 0;
    const BATCH_SIZE = 50;

    request.on('recordset', () => {
      res.setHeader('Content-Type', 'application/json');
      res.write('[');
    }

    request.on('row', row => {
      if (rowCount > 0)
        res.write(',');

      if (rows % BATCH_SIZE === 0)
        res.flush();

      res.write(JSON.stringify(row));
      rowCount++;
    }

    request.on('done', ()=> {
      res.write(']');
      sql.close();
      res.end();
    };
  };
};

答案 1 :(得分:0)

无需任何记录集考虑的正确方法是

let request = new sql.Request();
request.stream = true;
request.query(*query*);

request.on('row', row => {
        // Emitted for each row in a recordset
})

 request.on('error', err => {
        console.log(err);
        // May be emitted multiple times
 })
 request.on('done', result => {
        console.log("done ", result);
        // Always emitted as the last one
 })