2014-12-11 4 views
3

Я новичок в узле и работаю с mssql для подключения к SQL Server. кто-нибудь сможет помочь мне дать более полный пример потоковой передачи mssql. Я нахожу пример git неопределенным и не знаю, с чего начать. Любая помощь будет высоко оценена.Узел SQL Server mssql streaming

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

Я собираюсь Святого Necro это пост, потому что я столкнулся с той же проблемой сегодня, и хотел бы оставить что-то, что могло бы помочь будущему меня.

Согласно ExpressJsdocumentation, надлежащим образом, чтобы поток любой большой набор данных является write его в ответ, flush реакция иногда, а затем, когда сделано, end ответ.

mssqlNPM указывает, что есть несколько событий, на которые вы можете подписаться, например, те, которые указаны в вашем отрывке из их документации. Это здорово, но как вы интегрируете эти два?

Ну, я придумал следующее решение (может быть лучшим, но эй, это работает)

Идея заключается в том, чтобы поток данных из 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(); 
    }; 
    }; 
}; 
Смежные вопросы