msnodesqlv8 - exec存储过程

时间:2018-04-24 10:03:42

标签: node.js nightwatch.js

在我的NightWatch自动化测试中,我需要在测试运行之前将数据保持在正确的状态。要设置它,我需要对MSSQL-2016服务器执行一些存储过程。我使用msnodesqlv8,因为我发现它使用Trusted Connections。我无法使用此驱动程序构建调用存储过程的函数。 我有SELECT语句,例如

GetUserGuid: function(dbName, userName){
    var sql = require("msnodesqlv8");

    var connectionString = "server=.;Database=" + dbName + ";Trusted_Connection=Yes;Driver={SQL Server Native Client 11.0}";
    var query = "SELECT uGUID FROM Users WHERE Name = '" + userName + "'";

    return new Promise(function(resolve, reject) {
        sql.query(connectionString, query, (err, rows) => {
            resolve(rows[0].uGUID);
        });
    })
}

由于我没有正常工作存储过程调用我为sp语句后续工作函数构建函数。

CreateUser: function(dbName, userName){
    var sql = require("msnodesqlv8");

        var connectionString = "server=.;Database="+ dbName + ";Trusted_Connection=Yes;Driver={SQL Server Native Client 11.0}";
        var guid = uuidv4();
        var query = "exec dbo.CreateUser @userId='" + guid + "', @sDescription='" + userName + "'";

        return new Promise(function(resolve, reject) {
            sql.query(connectionString, query, (err, rows) => {
                resolve('user created');
            });
        })
}

然而它也不起作用。

你有研究员的提示吗?

2 个答案:

答案 0 :(得分:1)

所以,解决方案是有问题的,因为我没想到它会如此明显。

在msnodesqlv8包页面上给出的示例实际上有效;)

参数应传递给数组中的过程,而不会转换为期望的类型。

以下是我案例的正确实施。

CreateUser: function(userName){
    return new Promise(function(resolve, reject) {
        sql.open(settings.ConnectionString, function (err, conn) {
            //console.log(conn);
            var pm = conn.procedureMgr();
            var guid = uuidv4();
            pm.callproc('dbo.CreateUser', [guid, userName], function(err, results, output) {
                if(err != null){
                    reject('user create - failed');
                }
                else{
                     resolve('user create - succeded'); 
                }               
            });
        });
    })
}

答案 1 :(得分:-1)

奇迹般地,调用包含PRINT语句的存储过程将永远无法完成。

所以这些都不要!