从JavaScript将日期传递给ADODB.Command参数
使用老式的经典ADO,而不是ADO.NET,如何从JavaScript向存储过程传递日期值?JS在IIS7上的经典ASP页面中运行。SQL Server是2012(1) 已解决:请参阅下面的答案。长话短说,结果通过一个JSON字符串化器返回给我,该字符串化器忽略了具有不同日期值的属性 我在SQL Server中有一个存储过程:从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; 我在一个
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));
}