0

問題簡而言之:相同的數據庫在不同的服務器上以不同的格式返回日期,並且我很難將其配置爲更正日期格式。配置FoxPro數據庫使用的日期格式

我有以下情況: 一個基於PHP的Web應用程序,它從Microsoft FoxPro 9數據庫獲取數據。 數據庫連接使用OleDB進行。在PHP中,這利用ADODB通過COM對象:

$this->connection = new COM("ADODB.Connection"); 
$this->connection->Open($this->connectionString); 

連接字符串看起來是這樣的:

Provider=VFPOLEDB.1; Mode=Share Deny None; Window Handle=0; 
Locale Identifier=1033; Prompt=4; Extended Properties=0; 
User ID=; Password=; Mask Password=False; Cache Authentication=False; 
Encrypt Password=False; OLE DB Services=0; Collating Sequence=MACHINE; DSN=; 
DELETED=True; ENGINEBEHAVIOR=80; TABLEVALIDATE=0; 
Data Source=\\path\to\file.DBC 

程序部署在不同的服務器遍佈世界各地,在不同版本的Windows Server上運行(2003 -2008 R2)。查詢的執行方式如下:

$this->connection->Execute($query); 

這將返回一個結果集,其中包含明文中的所有值。這是問題出現的地方。這些數據庫不會使用相同的日期格式,這使得以後在PHP中處理日期變得困難。 到目前爲止,該應用程序可以應付美國格式:mm/dd/yyyy和荷蘭文格式:dd-mm-yyyy。該程序只是假定當日期包含斜槓時使用美國格式,並且在有連字符時使用d-m-y格式。 這已經很長時間了,但現在我們最近將程序部署到了巴西的服務器,該服務器以巴西格式dd/mm/yyyy返回日期。顯然現在這個計劃與美國格式混淆了。

我一直在試圖讓數據庫以不同的日期格式(美國)報告無濟於事。 在兩個不同的開發環境中,將窗口的區域設置更改爲不同的國家會立即改變數據庫使用的日期格式。這些開發環境都是Windows 7系統。 但是,這不適用於使用Windows Server的服務器。 我已在多臺服務器上對所有區域設置(格式,位置和系統區域設置)進行了更改,但沒有任何結果。即使使用正確的區域設置重新啓動或重新安裝FoxPro之後。數據庫保持報告日期格式,他們似乎卡住了。

有誰知道如何在Windows Server環境中更改FoxPro使用的日期格式?

我已經探索過的其他選項包括將區域信息放入DSN,但找不到任何可能的方法。此外FoxPro語句SET DATE TO .....不被OleDB接受。 改變應用程序以理解巴西格式或添加一堆if-else語句似乎不是一個可行的解決方案。

回答

1

FoxPro日期類型是日期格式不敏感的。也就是說,如果只是將該值作爲日期(日期時間)返回而不是轉換爲字符,則不應該有任何問題。

+0

確實如此,但是當程序接收到數據時,它位於ADO記錄集對象中。 這些是我必須使用的功能:http://msdn.microsoft.com/en-us/library/windows/desktop/ms675841%28v=vs.85%29.aspx 我還沒有找到方式來獲得除了它之外的其他任何東西。 – Valk6

+0

Field對象有一個Type屬性。我還沒有和ADO合作知道如何指定它,但我相信你可以。 –

+0

使用ADO API我並沒有真正找到解決方案。也許我應該切換到ADO PHP庫:http://phplens.com/lens/adodb/docs-adodb.htm。它具有日期格式化功能。 – Valk6

0

也許在您的查詢中是明確的,並處理重構Web應用程序中的日期。所以,如果你有在VFP日期型字段名爲指明MyDate然後執行:

select x, y, z, day(MyDate) as daynum, month(MyDate) as monthnum, ; 
year(MyDate) as yearnum from mytable 

好了,這是對其他更多的工作,重建從一個日期,但至少應該是地點無關。

+0

我同意這會更好,但我在這裏處理大量遺留代碼。不幸的是,它不是完美的面向對象,所以改變處理數據的所有查詢和代碼並不是真的可行。 – Valk6

1

將您的FoxPro日期字段DTOC函數換成第二個可選參數。無論區域設置如何,這將返回一個標準的YYYY-MM-DD樣式日期。

SELECT DTOC(dDate) as dDate FROM Alias 

如果這不可行,你需要調查職能,明確設置在FoxPro中的語言環境,如直觀地命名SYS(3005)

如果即使這樣做不可行,您也需要求助於國外的服務器在OS級別對其區域設置進行標準化。

+0

謝謝,我會嘗試SYS(3005),還沒有嘗試過那個! – Valk6