使用旧式经典 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/