繁体   English   中英

使用繁琐的(Node.js)执行SQL查询

[英]Executing SQL queries with tedious(Node.js)

我目前正在开发一个项目,要求我操作与时间报告应用程序相关的SQL表。 我现在简单的连接代码如下:

var Connection = require('tedious').Connection;  
var config = {  
    userName: 'my_user_name',  
    password: 'my_password',  
    server: 'server_to_access',
    database: 'database_in_SQL_Server_Management_Studio'  
};  
var connection = new Connection(config);  
connection.on('connect', function(err) {  
    console.log("Connected");  
}); 

它显示已建立连接,但是当我运行以下内容时:

var Connection = require('tedious').Connection;  
var Request = require('tedious').Request;



var config = {   
    userName: 'my_user_name',  
    password: 'my_password',  
    server: 'server_to_access',
    database: 'database_in_SQL_Server_Management_Studio'  
};  
var connection = new Connection(config);  
connection.on('connect', function(err) {  
    console.log("Connected"); 
    executeStatement();
});  

function executeStatement() {
    request = new Request("SELECT * FROM Employees", function(err, rowCount) {
      if (err) {
        console.log(err);
      } else {
        console.log(rowCount + ' rows');
      }
    });

    request.on('row', function(columns) {
      columns.forEach(function(column) {
        console.log(column.value);
      });
    });
    connection.execSql(request);
}

这是我在cmd中的输出:

C:\Users\name\attempt>node test.js
Connected
{ [RequestError: Requests can only be made in the LoggedIn state, not the Connec
ting state]
  message: 'Requests can only be made in the LoggedIn state, not the Connecting
state',
  code: 'EINVALIDSTATE' }

C:\Users\name\attempt>

管理SQL表的应用程序是MS SQL Server Management Studio 2008 R2。

任何关于我做错的方向都会非常感激。 谢谢!

您需要根据连接的可用性来管理请求和进程的队列(繁琐的包装器可能会有所帮助,而我之前没有使用过它https://github.com/mhingston/tedious-wrapper )。 这个伪代码是从我自己的工作解决方案中调整(而不是测试)的:

connection.on('connect', (err)=>{ RequestWrapper.next(err); });

const queue = [];

class RequestWrapper(){
    constructor(sql){ this.sql = sql; }
    static next(err){
        const next = queue.shift();
        if(next) next(err);
    }
    queue(args){
        return new Promise((ok, fail)=>{ 
            queue.push((err)=>{
                if(err) fail(err); else ok(this.request(args));
            })
        })
    }
    request(args){
        if(!connection) return Promise.reject(new Error(`connection required`));
        if(!connection.loggedIn || connection.state.name !== 'LoggedIn') return this.queue(args);

        return new Promise((ok, fail)=>{
            try{
                const request = new tedious.Request(this.sql, (err, count, rows)=>{

                    RequestWrapper.next();

                    if(err) return fail(err);
                    ok(rows);
                });
                ...add params here...
                connection.execSql(request);
            }catch(err){
                RequestWrapper.next();
                fail(err);
            }
        });
    }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM