2013-10-31 122 views
3

在我的應用程序中,我從一個數據庫中讀取數據並寫入第二個數據庫。該應用程序很快且很髒,所以我正在使用FieldByNameParamByName查詢中使用AsString來讀/寫。覆蓋系統日期格式

這從那裏數據類型是DateDateTime

至於我可以告訴FieldByName.AsString除了適用於我的所有用例使用系統ShortDateTime格式返回日期爲(對我來說)DD/MM/yyyy。該數據庫預計要寫入爲YYYY-MM-DD

根據Delphi Basics我應該能夠設置ShortDateFormat我所需要的日期,但似乎在XE5這不再的情況下(正確?)

在此處進一步挖掘返回thesetwo使用TFormatSettings覆蓋本地設置的問題。但是,這兩個都直接使用StrToDateFormatDateTime中的結果格式設置。

所以兩個問題

1)我可以告訴我的應用程序重寫系統ShortDateFormat

2)如果是這樣,如何(如果沒有,我有B計劃)?

+0

您應該在數據庫中使用日期時間類型列,並使用'AsDateTime'投射來填充值。將日期時間存儲爲字符串是不好的。 – TLama

+0

DB中的字段設置爲'DateTime'。在使用'AsDateTime'寫入列時,MySQL似乎總是窒息(至少在DBX下),所以我通常使用'FormatDateTime'來編寫'AsString'。在*這種情況下*保持字符串可能是可取的。 –

+1

聽起來像你應該找出爲什麼你不能使用'AsDateTime'。 –

回答

6

對日期和時間格式使用全局變量是原始RTL設計人員很久以前犯的一個錯誤。依賴全局格式設置的功能(如單參數StrToDate)被保留以實現向後兼容性,但不應使用它們。

日期/時間和字符串你應該之間的轉換:

  1. 初始化一個TFormatSettings實例與您的日期格式。
  2. 調用兩個參數StrToDate,將TFormatSettings從字符串轉換爲日期。
  3. 致電FormatDateTime過載,在另一方向轉換時接受TFormatSettings

現在,你的問題的主旨。在描述的場景中,您不應該根據日期和時間使用字符串。使用AsDateTime而不是AsString。如果您碰巧有一個數據庫列將日期/時間存儲爲字符串,那麼您應該使用基於TFormatSettings的轉換函數來解決該設計錯誤。

如果你完全用字符串做這件事,而且我不能說服你,否則你需要使用從SysUtils來控制你的短日期格式。

+0

謝謝大衛。非常清楚。正如上面評論的那樣,DB在適當的時候被設置爲'DateTime',我們從未設法說服MySQL/DBX在寫入時接受'AsDateTime'。我正在處理的這個例子對於列是非常動態的,所以添加列類型識別將是一種痛苦,但是可能的。然而,TFormatSettings的額外信息將會很有用。 –