0

Кратким образом: одна и та же база данных возвращает даты в другом формате на разных серверах, и мне трудно настроить ее для корректировки формата даты.Конфигурирование формата даты, используемого базой данных FoxPro

У меня есть следующая ситуация: Веб-приложение на основе PHP, которое получает данные из баз данных 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. Пока приложение может справиться с форматом США: мм/дд/гггг и голландский формат: дд-мм-гггг. Программа просто предполагает, что, когда дата содержит слэши, используется формат США, и когда используются дефисы, используется формат d-m-y. Это было хорошо в течение длительного времени, но теперь мы недавно развернули программу на сервер в Бразилии, который возвращает даты в бразильском формате dd/mm/yyyy. Очевидно, что программа смущает это в формате США.

Я пытался получить базу данных для отчета в другом формате даты (США) безрезультатно. В двух разных средах, изменяющих региональные настройки окон в другую страну, немедленно изменяется формат даты, используемый базой данных. Эти dev-сред - это все системы Windows 7. Однако это не будет работать на серверах с Windows Server. Я изменил все региональные настройки (форматы, местоположение и локали системы) на нескольких серверах без каких-либо результатов. Даже после перезагрузки или переустановки FoxPro с правильными региональными настройками. Базы данных сохраняют отчетность в формате даты, в котором они, похоже, застряли.

Кто-нибудь знает, как я могу изменить формат даты, используемый FoxPro в среде Windows Server?

Другие варианты, которые я изучил, включают размещение региональной информации в DSN, но я не могу найти какой-либо возможный способ. Также заявление FoxPro SET DATE TO ..... не принимается через OleDB. Изменение приложения для понимания бразильского формата или добавления кучи инструкций if-else не похоже на возможное решение.

ответ

1

Тип даты FoxPro не зависит от даты. То есть, если вы просто возвращаете значение как дату (datetime), а не конвертируете в символ, у вас не должно быть никаких проблем.

+0

Это правда, но когда программа получает данные, они находятся в объекте Recordset 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

Может быть, явным в вашем запросе и обработкой, чтобы восстановить дату в веб-приложении. Так что если у вас есть поле даты типа в 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).

И если это невозможно, вам необходимо обратиться к серверам за рубежом, чтобы их региональные настройки были стандартизированы на уровне ОС.

+0

Спасибо, я попробую SYS (3005), не пробовал это! – Valk6