【发布时间】:2013-12-25 01:30:38
【问题描述】:
使用老式的经典 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;如果我对其进行更改,它们会反映在返回的内容中。
我从Eric Lippert's answer here 得到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 版权所有 (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.0 (内部版本 6002:Service Pack 2)(管理程序)'
【问题讨论】:
-
ad.ParamInput是错字吗? -
@Kul-Tigin 是的,谢谢。已更正。
-
它对我有用。如果更正错字后问题仍然存在,您可能希望共享您的连接字符串。一些驱动程序/提供程序可能会导致这样的问题。
-
Provider=SQLOLEDB;Data Source=SERVERNAME;Initial Catalog=DatabaseName;Integrated Security=SSPI
-
一个很好的资源是 Carl Prothman - Data Type Mapping 它表明
adDBTimeStamp相当于 SQL Server 中的datetime和smalldatetime。
标签: javascript sql sql-server asp-classic ado