2

複数のデータベース呼び出しを行うために、Tedious ( http://pekim.github.io/tedious/ ) SQL サーバー プラグインで NodeJS を使用しようとしています。私の意図は次のとおりです。 1.接続を開きます 2.トランザクションを開始します 3.データを返さない複数のデータベース(ストアドプロシージャ)呼び出しを行います。4. トランザクションをコミットします (またはエラーでロールバックします)。5.接続を閉じる

NodeJS の (トランザクションを使用しない) .js ファイルの例を次に示します。複数のデータベース呼び出しを実行しようとすると、「要求は 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!');
4

4 に答える 4

3

確立されていない接続でステートメントを実行しようとしています。を呼び出す前に、エラー ハンドラがありません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.");
        });
    });
});
于 2014-12-01T19:47:22.600 に答える
0

退屈な接続プールを使用できますhttps://github.com/pekim/tedious-connection-pool

于 2014-12-23T08:16:01.343 に答える