javascript - 从 JavaScript 将日期传递给 ADODB.Command 参数

标签 javascript sql sql-server asp-classic ado

使用旧式经典 ADO,不是 ADO.NET,如何将日期值从 JavaScript 传递到存储过程? JS 运行在 IIS7 上的经典 ASP 页面中。 SQL Server 是 2012 (1)。

已解决:请参阅下面的答案。长话短说,结果是通过忽略具有不同日期值的属性的 JSON 字符串生成器返回给我的。

我在 SQL Server 中有一个存储过程:

create procedure test(@n int, @d datetime)
as
begin
    select @n n, @d d;
end;

我在经典的 ASP 页面中有一些 JavaScript 代码:

var conn = new ActiveXObject("ADODB.Connection");
var cmd = new ActiveXObject("ADODB.Command");

conn.Open(connectionString);

cmd.ActiveConnection = conn;

cmd.CommandType = adCmdStoredProc;
cmd.CommandText = 'dbo.test';

cmd.Parameters.Append(cmd.CreateParameter('@n', adInteger, adParamInput, 4, 123));

var param = cmd.CreateParameter('@d', adDate, adParamInput);

param.Value = (new Date('01/01/2000')).getVarDate();

cmd.Parameters.Append(param);

var rs = cmd.Execute();

我从 SP 返回的值始终具有 @n 的预期值(123,以上),并且总是有 null对于 @d . connectionString一定没问题,因为它确实调用了 SP,而且它绝对是我认为我正在调用的 SP;如果我对其进行更改,它们会反射(reflect)在返回的内容中。

我得到 getVarDate()来自 Eric Lippert's answer here .我也试过adDBDate具有各种数据类型。

为了测试,我写了上面的测试SP;您可能已经注意到它并没有做很多有用的工作。在生产中,我必须将日期传递给现有的 SP。该 SP 的详细信息不会使这个问题更加清晰。如果绝对必须的话,我可以编写一个包装器 SP,它以字符串形式接收日期并将其转换。但我想了解这里出了什么问题,我们已经有足够多的半冗余 SP 使数据库变得困惑。那只是一种可怕的做事方式。

(1) @@version = 'Microsoft SQL Server 2012 (SP1) - 11.0.3381.0 (X64) 2013 年 8 月 23 日 20:08:13 版权所有 (c) Windows NT 6.0 上的 Microsoft Corporation 企业版(64 位) (构建 6002:Service Pack 2)(管理程序)'

最佳答案

想通了;我错了,我什至没有提到真正导致问题的部分。

rs.Fields.Item("d").Value 返回 adDBTimeStamp 类型的变体。

这是在充当 Web 服务并返回 JSON 的 ASP 中,以及 the JSON stringifier I'm using只是忽略具有 adDBTimeStamp 值的属性。一切都从数据库恢复正常,然后又被丢弃了。

事实证明,ADODB.Command 的 CreateParameter 方法非常适合处理日期。

所以:

var rs = RecordSetToObjArray(cmd.Execute();

//  ...

//  Convert variant dates into something the JSON stringifier groks. 
function GetADOFieldValue(field) {
    switch (field.Type) {
        case adDBTimeStamp:
        case adDate:
        case adDBDate:
        case adDBTime:
        case adFileTime:
            if ('undefined' === '' + field.Value)
                return null;
            return new Date('' + field.Value);

        default:
            return field.Value;
    }
}

//  Given recordset from ADODBCommand.Execute(), return as array of JSON 
//  objects. 
//  Also convert variant dates into something the JSON stringifier groks. 
//  If an SP returns multiple recordsets, that's on you. 
function RecordSetToObjArray(rs) {
    var rtn = [];
    var fieldNames = [];

    for (var i = 0; i < rs.Fields.Count; ++i) {
        fieldNames.push(rs.Fields.Item(i).Name);
    }

    rtn.FieldNames = fieldNames;

    while (!rs.EOF) {
        var rec = {};

        for (var i = 0; i < fieldNames.length; ++i) {
            rec[fieldNames[i]] = GetADOFieldValue(rs.Fields.Item(fieldNames[i]));
        }
        rtn.push(rec);
        rs.MoveNext();
    }

    return rtn;
}

function RecordSetToScalar(rs) {
    if (rs.RecordCount == 0 || rs.Fields.Count == 0)
        return null;
    return GetADOFieldValue(rs.Fields.Item(0));
}

关于javascript - 从 JavaScript 将日期传递给 ADODB.Command 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20749733/

相关文章:

php - 如何使用dreamweaver在MySQL中插入值

sql - 比较 SQL Server 中由特殊字符分隔的值

sql - SQL Server 中的计数除以计数(*)

javascript - jquery没有冲突错误不是函数

javascript - 自动幻灯片不工作 JavaScript

java 替代 angularJs watch

javascript - 如何在 Bootstrap 日期时间选择器中禁用从今天开始的过去日期?

sql - 在 Oracle SQL 中,单竖线字符 ( '|') 的用途是什么?

sql - 为什么存储过程不能与 select、where 和 having 一起使用

sql-server - SQL Server 2012 - 安装程序的 "Feature Selection"屏幕上不包含 Analysis Services