3

我正在尝试使用繁琐的 TVP,并在使用DateTime参数时不断收到此错误。

构建请求时的异常是:

 days = Math.floor((parameter.value.getTime() - UTC_EPOCH_DATE.getTime()) /
 (1000 * 60 * 60 * 24));
                                             ^

例外:

TypeError:parameter.value.getTime 不是函数

代码看起来像这样

/*declare table*/``    
let table = {
        columns: [
            { name: 'a', type: TYPES.VarChar, length: 50, nullable: true },
            { name: 'b', type: TYPES.Int},
            { name: 'c', type: TYPES.DateTime}

        ],
        rows: [
           ['hello tvp', 777,'05/08/07 12:35 PM'],
           ['OLO', 45,'05/08/16 1:30 AM']
        ]
    };

/*request code*/
var request = new Request("MyCustomStoredProcedure", function (err, rowCount) {
                    if (!err) {
                        callback(err)
                        logger.info("rowCount", rowCount)
                    } else {
                        callback(rowCount)
                        logger.error("Error => ", err)
                    }
                });
                request.addParameter('tvp', TYPES.TVP, table);

                request.on('row', function (columns) {
                     logger.info("data", columns)
                });

                connection.callProcedure(request);



CREATE TYPE TestType AS TABLE (a VARCHAR(50), b INT, c DateTime);

CREATE PROCEDURE MyCustomStoredProcedure 
    (@tvp TestType readonly) 
AS 
    SELECT * 
    FROM @tvp

查看 data-types.js 的繁琐代码,我发现它parameter.value是一个字符串而不是一个对象。

不知道我在这里做错了什么。

我试过的

  • 没有datetime- 工作
  • with DateTime2- 传入的表格数据流 (TDS) 远程过程调用 (RPC) 协议流不正确。参数 2 (""):数据类型 0x03 未知。
  • 使用https://github.com/patriksimek/node-mssql,但在内部它再次使用 Tedious
4

3 回答 3

5

我使用 Varchar 而不是 DateTime,它解决了我的问题。我知道这不是最好的解决方案,但为了时间,我接受了。

于 2016-06-27T21:23:06.087 回答
1

这是我的解决方法;这对我有用。

顺便说一句,我已经确认这种不良行为是“tediousjs”和/或“mssql”中的一个已知错误,截至 2017 年 11 月仍未修复。

https://github.com/tediousjs/tedious/pull/623

我感谢 Rajat Banerjee 和 Ahmed Ashour;如果没有他们的回答,我将陷入大麻烦。错误消息非常具有误导性。

Rajat 说“使用 VarChar”,Ahmed 说“没有时区”。所以这是我的解决方法,分解成微小的细节。

首先获取一个用于创建日期的值。请注意,您需要 UTC,因为这是 SQL Server 所期望的。

 var myDateInt = Date.UTC(2018, 12, 31, 0, 0, 0)
 console.log(myDateInt)
 // 1548892800000

 var myDateObj = new Date(myDateInt)
 console.log(myDateObj)
 // Wed Jan 30 2019 18:00:00 GMT-0600 (CST)

解决方法是三个步骤。
第 1 步,获取 ISO 字符串。

 var myDateISOString = myDateObj.toISOString()
 console.log(myDateISOString)
 // 2019-01-31T00:00:00.000Z

在 ISO 字符串中,时区始终为“zulu”,由末尾的字母“Z”表示。
第 2 步是删除时区。

 var myDateSQLString = myDateISOString.replace(/Z$/,"")
 console.log(myDateSQLString)
 // 2019-01-31T00:00:00.000

第 3 步是在向 MsSql 对象声明值时使用“VarChar()”。

 mssql_request.input(myDateSQLString,'VarChar(30)',value);

这对我有用。

于 2018-03-20T00:39:08.317 回答
1

您的日期格式有问题。javascript 的日期时间有一个时区元素 SQL 的日期时间没有时区。

尝试

['hello tvp', 777,new Date('05/08/07 12:35 PM')]

我遇到了同样的问题,在时区中添加解决了它。

于 2017-02-16T10:18:56.537 回答