弄清楚了; 我错了,我什至没有提到实际上引起问题的那部分。
rs.Fields.Item("d").Value
返回type的变体adDBTimeStamp
。
这是在充当Web服务并返回JSON的ASP中,而我正在使用的JSON字符串标识符只是忽略带有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));
}