2014-12-01 18 views
1

我正在尝试将NodeJS与Tedious(http://pekim.github.io/tedious/)sql服务器插件一起使用来进行多个数据库调用。我的意图是: 1.打开连接 2.开始一个事务 3.进行多个数据库(存储过程)调用,这将不会返回任何数据。 4.提交事务(或回滚出错)。 5.关闭连接如何使用Node.js和Tedious从单个连接/事务中进行多个数据库调用

下面是一个示例.js文件,(不使用事务)用于NodeJS,我尝试进行多个数据库调用,并且出现错误“请求只能在LoggedIn中进行状态,而不是SentClientRequest状态。“我没有尝试解决这个问题。

有谁知道如何解决这个问题?

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

var config = { 
    userName: 'login', 
    password: 'password', 
    server: '127.0.0.1', 
    options: { rowCollectionOnDone: true } 
}; 

var max = 1; 
for (var i = 0; i < max; i++) { 
    var connection = new Connection(config); 

    function executeStatement() { 
     request = new Request("select 42, 'hello world'", 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); 
      }); 
     }); 

     request.on('doneInProc', function (rowCount, more, rows) { 
     }); 

     request.on('doneProc', function (rowCount, more, rows) { 
      console.log('statement completed!') 
      connection.execSql(request); 
     }); 

     request.on('returnStatus', function (status) { 
      console.log('statement completed!') 
     }); 

     connection.execSql(request); 
    } 

    connection.on('connect', function (err) { 
     // If no error, then good to go... 
     executeStatement(); 
    }); 
} 
console.log('Done!'); 

回答

2

您试图对未建立的连接执行语句。在致电executeStatement之前,您错过了错误处理程序。

connection.on('connect', function (err) { 
    if (err) { 
     console.log(err); // replace with your code 
     return; 
    }; 

    // If no error, then good to go... 
    executeStatement(); 
}); 

编辑:

如何在交易中串行执行多个语句:

var statements = ["select 1", "select 2", "select 3"]; 

var transaction = new sql.Transaction(connection); 
transaction.begin(function(err) { 
    // ... error checks 

    async.mapSeries(statements, function(statement, next) { 
     var request = new sql.Request(transaction); 
     request.query(statement, next); 
    }, function(err, results) { 
     // ... error checks 

     transaction.commit(function(err, recordset) { 
      // ... error checks 

      console.log("Transaction commited."); 
     }); 
    }); 
}); 
+0

你是正确的,应该在连接上进行错误检查,但这不是问题。我只能在连接上执行一条sql语句。问题是如何在连接上执行多个语句,串行。这样我就可以在事务中批量处理多个命令。我可能会有太多的语句在一次调用中链接在一起来执行sql。 – 2014-12-04 02:01:02

+0

在上一个完成之前,您不得执行语句。为了确保您应该使用(或编写自己的)异步库,如'async'。 – 2014-12-04 14:42:42

+0

我已经用示例更新了我的答案,如何在使用异步的事务中执行多个语句。 – 2014-12-04 14:54:17

0

您应该使用繁琐的连接池创建多个连接池。 对于节点JS,一个NPM模块,请访问:https://www.npmjs.com/package/tedious-connection-pool

对于在for循环中,你可以购买一个新的连接和doneInProc事件中使用connection.reset每一个新的价值。 您一直在做的情况是正确执行for循环的第一次迭代(LoggedIn State),并且您已经进行了操作而没有关闭或释放使用相同连接对象(SentClientRequest state)的连接。 因此,当代码达到for循环的第二次迭代时,同一个对象处于最终状态。 希望它解决你的问题

相关问题