Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从JavaScript将日期传递给ADODB.Command参数_Javascript_Sql_Sql Server_Asp Classic_Ado - Fatal编程技术网

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

从JavaScript将日期传递给ADODB.Command参数,javascript,sql,sql-server,asp-classic,ado,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; 我在一个

使用老式的经典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,如上)的预期值,并且对于
@d
,始终具有
null
connectionString
必须正常,因为它确实调用了SP,而且我想我正在调用的肯定是SP;如果我对它进行更改,它们将反映在返回的内容中

我从中获取
getVarDate()
。我还尝试了使用各种数据类型的
adDBDate

我编写上述测试SP是为了进行测试;您可能已经注意到,它没有做很多有用的工作。在生产过程中,我必须向现有SP传递一个日期。该SP的详细信息不会让这个问题变得很清楚。如果必须的话,我可以编写一个包装器SP,将日期作为字符串接收并进行转换。但我想知道这里到底出了什么问题,我们已经有足够多的半冗余SP将数据库弄得乱七八糟。这是一种可怕的做事方式


(1) @@version='Microsoft SQL Server 2012(SP1)-11.0.3381.0(X64)2013年8月23日20:08:13 Windows NT 6.0(Build 6002:Service Pack 2)(管理程序)上的Microsoft Corporation Enterprise Edition(64位)版权所有;我大错特错了,我甚至没有提到真正导致问题的部分

rs.Fields.Item(“d”).Value
返回类型为
adDBTimeStamp
的变量

这是在一个ASP中,它充当web服务并返回JSON,只忽略带有
adDBTimeStamp
值的属性。DB的一切都恢复得很好,后来又被放弃了

事实证明,ADODB.Command的
CreateParameter
方法非常乐于处理日期

因此:

var rs=RecordSetToObjArray(cmd.Execute();
//  ...
//将变量日期转换为JSON字符串化程序所要求的内容。
函数GetADOFieldValue(字段){
开关(字段类型){
案例地址时间戳:
案例地址:
案例地址:
案例添加时间:
案例时间:
if('undefined'=''+field.Value)
返回null;
返回新日期(“”+字段值);
违约:
返回字段.值;
}
}
//给定ADODBCommand.Execute()中的记录集,作为JSON数组返回
//对象。
//还可以将变量日期转换为JSON字符串化程序所要求的内容。
//如果SP返回多个记录集,则由您决定。
函数记录SetToObjArray(rs){
var rtn=[];
var fieldNames=[];
对于(变量i=0;i
ad.ParamInput
输入错误吗?@Kul Tigin是的,谢谢。已更正。它对我有效。如果在更正输入错误后问题仍然存在,您可能希望共享您的连接字符串。某些驱动程序/提供程序可能会导致这样的问题。提供程序=SQLOLEDB;数据源=服务器名;初始目录=数据库名;集成安全性=SSPI对于这种情况来说是一个很好的资源,它表明
adDBTimeStamp
相当于SQL Server中的
datetime
smalldatetime
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));
}