2013-12-23 84 views
2

使用舊式經典ADO,而不是 ADO.NET,如何將日期值傳遞給JavaScript中的存儲過程? JS運行在IIS7上的經典ASP頁面中。 SQL Server是2012(1)。傳遞日期到JavaScript的ADODB.Command參數

已解答:請參閱下面的答案。長話短說,結果是通過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@dconnectionString必須確定,因爲它確實叫SP,而且它絕對是我認爲我打電話給的SP;如果我對它進行修改,它們會反映回來的內容。

我從Eric Lippert's answer here得到getVarDate()。我也嘗試過使用各種數據類型的adDBDate

我爲測試目的寫了上述測試SP;你可能已經注意到它並沒有做太多有用的工作。在生產中,我必須將日期傳遞給現有的SP。該SP的細節並不能說明這個問題。我可以,如果我絕對必須,寫一個包裝SP,接收日期作爲一個字符串,並將其轉換。但是我想知道這裏出了什麼問題,而且我們已經有足夠多的半冗餘SP將數據庫弄亂了。而這只是一個可怕的做事方式。 (1)@@ version ='Microsoft Windows Server 2012(SP1) - 11.0.3381.0(X64)2013年8月23日20:08:13 Copyright(c)Windows NT上的Microsoft Corporation Enterprise Edition(64位) 6.0(Build 6002:Service Pack 2)(管理程序)'

+0

是'ad.ParamInput'一個錯字? –

+0

@ Kul-Tigin是的,謝謝。糾正。 –

+0

它適合我。如果糾正錯字後問題仍然存在,您可能需要分享連接字符串。一些司機/供應商可能會導致類似的問題。 –

回答

1

想通了;我錯了,我甚至沒有提到實際上導致問題的部分。

rs.Fields.Item("d").Value返回adDBTimeStamp類型的變體。

這是在ASP中充當Web服務並返回JSON,並且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)); 
}