2014-12-01 20 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循環的第二次迭代時,同一個對象處於最終狀態。 希望它解決你的問題

相關問題