2011-06-16 85 views
1

我們正在嘗試遷移到SQL Azure的一系列傳統應用程序。這些應用程序是使用大量基於字符串的查詢在經典ASP中編寫的。有很多要重寫,以使其值得遷移。如何強制SQL Azure接受查詢字符串中的DMY?

由於SQL字符串查詢使用UK DMY格式,所以帶日期的任何查詢都失敗。 SQL Azure用戶和DB似乎很難使用使用美國英文格式。

如果我添加SET DATEFORMAT dmy;查詢字符串之前查詢然後工作。但是,這需要更改數千個查詢。無論如何強迫SQL Azure使用DMY格式作爲連接字符串的一部分?那還是或者一些其他解決方案可以幫助我們重新編寫數千個查詢?任何方式來設置一個登錄總是使用DMY格式或使整個數據庫使用DMY等?

感謝

格雷姆

回答

1

我認爲,理查德的建議是這樣的:

原始代碼:

Dim rs 
Set rs = Server.CreateObject("ADO.Recordset") 
... recordset shiznit ... 
Set rs = nothing 

新代碼:

Dim rs 
Set rs = New cHomegrownAdoRecordsetWrapper 
... same unchanged recordset shiznit ... 
Set rs = nothing 

如果代碼在VBScript,雖然,你會很難實現這一點。

第一個問題你運行[如果你嘗試在VBScript本身做],ADO Recordset對象在其方法中大量使用可選參數,並且你不能創建一個函數(或類方法)在VBScript中有可選參數。因此,您將無法將任何有用的子類化。

雖然您可以在JScript中繼承ADo記錄集對象,但可以在同一頁中使用同一腳本混合並匹配兩種語言;只要意識到JScript將首先執行的任何內容,無論它在頁面中的什麼位置。 ASP首先運行JScr​​ipt解釋器,然後運行VBScript解釋器。

您可能也可以創建自己的基於COM的DLL來封裝ADO對象......但您必須自己調查一下。

現在。

如果是我,我會嚴肅看待搜索&替換,具體取決於代碼的一致性。

如果您可以使用「dd FullMonthName YYYY」(即明確的日期格式)獲得內聯查詢的代碼,則無需擔心數據庫的DMY問題,代碼將會在任何運行的SQL版本上生存。

只要日期具有基於文本的月份名稱和全年,SQL就不會考慮它們的順序。

我懷疑你甚至可以把Richard的想法放在一個更小的範圍內,並且在有內聯日期的地方放一個包裝函數,做一些運行時嗅探,然後讓所有的東西重新工作。

+0

就像自定義ADO DLL的想法 - 聽起來很明智,但我懷疑我會花時間去做。鑑於它所有的VBScript我認爲這是查找和替換。我想所有的SQL將以選擇,插入,更新或刪除或調用存儲過程開始。只需在每個SQL字符串的開頭添加set dateformat DMY部分,它應該是好的。我更喜歡將所有日期更改爲使用「dd FullMonthName YYYY」格式的想法,但這會花費更多時間。我希望我可以強制SQL Azure使用英國日期格式進行一次登錄等,或將其設置爲連接字符串。 – GraemeMiller 2011-06-18 12:12:39

1

你可以繼承連接本身這樣,每當一個命令被送到它前面加上SET DATEFORMAT命令。這將需要重構引擎,但這可以通過搜索替換來實現。

+0

在經典ASP中看起來如何?我不認爲它支持大多數面向對象的東西。我們所有的連接都基於ADODB.Recordset – GraemeMiller 2011-06-17 08:06:38

相關問題