SQL 运行带有 NodeJS 和 MSSQL 包错误的存储过程

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/38909920/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-01 04:46:43  来源:igfitidea点击:

Running a stored procedure with NodeJS and MSSQL package error

sqlsql-servernode.jsnodes

提问by Adam91Holt

Im trying to get the MSSQL nodejs package to return the results of a stored procedure from Microsoft SQL server using the code below. However the error I get is...

我试图让 MSSQL nodejs 包使用下面的代码从 Microsoft SQL 服务器返回存储过程的结果。但是我得到的错误是......

[TypeError: Cannot read property 'type' of undefined]

I'm not sure I have done the inputs correctly as I couldn't find an example with more than one input anywhere online.

我不确定我是否正确地完成了输入,因为我在网上的任何地方都找不到包含多个输入的示例。

Any ideas?

有任何想法吗?

exports.executeSqlStoredProd = function (callback) {
    var conn = new sqlDb.Connection(settings.dbConfig)
    conn.connect().then(function () { 
        var req = new sqlDb.Request(conn);
        req.input('ProductEntryID', req.Int, 3299);
        req.input('LoginEntryID', req.Int, 4);
        req.input('TempLoginEntryId', req.Int, -1);
        req.input('AddToWishList', req.Bit, 0);
        req.input('WebPortalId', req.Int, 0);
        req.execute('J_ViewAProduct').then(function(err, recordsets) {
        console.log(recordsets);
        callback(recordsets)
    })}).catch(function(err){ 
        console.log(err);
        callback(null, err);
    });
}

I did the request sucessfully using the package "Seriate" but would prefer to use mssql. The code that worked for "Seriate" is below.

我使用包“Seriate”成功完成了请求,但更喜欢使用 mssql。适用于“系列”的代码如下。

exports.getVAP = function(req, resp, pid) {  
    sql.execute({
        procedure: "J_ViewAProduct",
        params: {
            ProductEntryID: {
                type: sql.INT,
                val: pid
            },
            LoginEntryID: {
                type: sql.Int,
                val: 4
            },
            TempLoginEntryId: {
                type: sql.Int,
                val: -1
            },
            AddToWishList: {
                type: sql.Bit,
                val: 0
            },
            WebPortalId: {
                type: sql.Int,
                val: 0
            }
        }
    }).then(function(results){
        console.log(results)
        httpMsgs.sendJSON(req, resp, results)
        //httpMsgs.sendJSON(req, resp, results[0])
        resp.end();
    }), function(err){
        httpMsgs.show500(req, resp, err)
    }

};

回答by shanmugharaj

I think the line's

我认为这条线

req.input('ProductEntryID', req.Int, 3299);
req.input('LoginEntryID', req.Int, 4);
req.input('TempLoginEntryId', req.Int, -1);
req.input('AddToWishList', req.Bit, 0);
req.input('WebPortalId', req.Int, 0);

which has req.input thats wrong it seems.

它有 req.input 那似乎是错误的。

Please try this code

请试试这个代码

var sql = require('mssql');

var config = {
    user: 'sa',
    password: '---',
    server: 'localhost', // You can use 'localhost\instance' to connect to named instance
    database: 'Test'
}

var getCities = function() {
  var conn = new sql.Connection(config);
  conn.connect().then(function(conn) {
    var request = new sql.Request(conn);
    request.input('City', sql.VarChar(30), 'Cbe');
    request.input('NameNew', sql.VarChar(30), 'Cbe');
    request.execute('spTest').then(function(err, recordsets, returnValue, affected) {
      console.dir(recordsets);
      console.dir(err);
    }).catch(function(err) {
      console.log(err);
    });
  });
}

getCities();

I tried this myself and its giving the results.

我自己试过了,它给出了结果。

回答by buggy_coder

I don't know if this would be helpful or not but this is how I did

我不知道这是否有帮助,但这就是我所做的

let executeQuery = async (value, country) => {
    try {
        let pool = await sql.connect(dbConfig);
        let results = await pool.request()
            .input('input_parameter', sql.Int, value)
            .input('Country', sql.VarChar(50), country)
            // .output('output_parameter', sql.VarChar(50))
            .execute('procedure_name')

        console.dir(results);

    } catch (err) {
        res.json({
            "error": true,
            "message": "Error executing query"
        })
    }
}

executeQuery(value, country);

I've used async and await method to make it more readable.

我使用 async 和 await 方法使其更具可读性。