0

要するに、同じデータベースが異なるサーバーでは異なる形式で日付を返すため、正しい日付形式に設定するのに問題があります。

次の状況があります: Microsoft FoxPro 9 データベースからデータを取得する PHP ベースの Web アプリケーション。データベース接続は OleDB で行われます。PHP では、これは COM オブジェクトを介して ADODB を利用します。

$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 に対応しています。プログラムは、日付にスラッシュが含まれている場合は US 形式が使用され、ハイフンが含まれている場合は dmy 形式が使用されると想定しています。これは長い間順調に進んでいますが、最近、プログラムをブラジルのサーバーに展開しました。このプログラムは、ブラジルの形式 dd/mm/yyyy で日付を返します。プログラムは明らかにこれを米国の形式と混同しています。

データベースに別の日付形式(米国)で報告させようとしましたが、役に立ちませんでした。2 つの異なる開発環境で、Windows の地域設定を別の国に変更すると、データベースが使用する日付形式がすぐに変更されます。これらの開発環境はすべて Windows 7 システムです。ただし、これは Windows Server を使用するサーバーでは機能しません。複数のサーバーですべての地域設定 (形式、場所、システム ロケール) を変更しましたが、結果はありません。正しい地域設定で FoxPro を再起動または再インストールした後でも。データベースは、スタックしているように見える日付形式で報告し続けます。

Windows Server 環境で FoxPro が使用する日付形式を変更する方法を知っている人はいますか?

私が調査した他のオプションには、地域情報を DSN に入れることが含まれますが、可能な方法を見つけることができませんでした。また、FoxPro ステートメントSET DATE TO .....は OleDB では受け入れられません。ブラジルの形式を理解するようにアプリケーションを変更したり、多数の if-else ステートメントを追加したりすることは、実行可能な解決策とは思えません。

4

3 に答える 3

1

2 番目の省略可能なパラメーターを使用して、FoxPro 日付フィールドをDTOC関数でラップします。これは、地域設定に関係なく、標準の YYYY-MM-DD スタイルの日付を返します。

SELECT DTOC(dDate) as dDate FROM Alias

それが不可能な場合は、関数を調べて、直感的に名前が付けられたSYS(3005)など、FoxPro でロケールを明示的に設定する必要があります。

それが不可能な場合でも、外国のサーバーに地域設定を OS レベルで標準化するよう要求する必要があります。

于 2013-08-01T05:05:19.290 に答える
0

おそらく、クエリで明示的に記述し、Web アプリケーション内で日付の再構築を処理します。したがって、VFP に MyDate という日付型フィールドがある場合は、次のようにします。

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

わかりましたので、それから日付を再構築するのは他の人にとってより多くの作業ですが、少なくとも場所にとらわれないはずです。

于 2013-07-25T20:12:37.253 に答える