2016-09-29 121 views
4

我在C#中使用日期編寫了一個程序。它從SQL Server表中獲取值。我使用的是Windows 7並且程序運行良好。我有這行代碼:無法將DateTime從SQL Server轉換爲C#日期時間

DateTime fechaOperacion = Convert.ToDateTime(reader["FechaOperacion"]); 

讀者在24小時格式返回的日期,我可以將其轉換成一個DateTime變量。

現在,我做了一個系統升級到Windows 10的代碼,同一行拋出以下錯誤:

String was not recognized as a valid DateTime. there is an unknown word starting at index 20.

而且現在的讀者上午返回/下午格式,並在索引20有a.m或p.m.

我曾嘗試以下的事情:

  • 改寫的代碼行:

    1. Convert.ToDateTime(reader["FechaOperacion"], System.Globalization.CultureInfo.InvariantCulture)
    2. reader.GetDateTime(reader.GetOrdinal("FechaOperacion"));
  • 轉換的文化,24小時格式

    System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(1033); 
    

但這一切,似乎工作,我不知道自己還能做些什麼。

+0

定義「它似乎不工作」的轉化。尤其是,'reader.GetDateTime(reader.GetOrdinal(「FechaOperacion」))'的結果是什麼,這是正確讀取獨立於任何格式的DATETIME列的方法? –

+2

究竟**是什麼**閱讀器[「FechaOperacion」]'返回?它提到'String'的事實意味着它不是「sql DateTime」 - SQL'datetime'值可以很好,不需要解析。那麼,它是什麼? –

+0

如果'FechaOperacion'是一個DATETIME列,那麼它聽起來像是一個顯示問題。如果你做了'var dateStr = fechaOperacion.ToString(「dd/MM/yyyy HH:mm:ss」);'? 'dateStr'的價值是什麼? – Howwie

回答

7

最終,這裏的底層問題是將代表日期/時間的值存儲爲文本數據(意思是某種[n][var]char({max|n})或推式:[n]text)。這有多種問題:

  • 它需要更多的空間
  • 不能正確排序/有效
  • 不能正確索引/有效
  • 不能正確/有效
  • 它會導致過濾解析客戶端和服務器之間的錯誤
  • 它具有各種本地化和國際化問題

你應該有一個datetime/date/time/etc列。然後將其存儲爲需要零解析的號碼(不是字符串),並且可以可靠地工作而不會出現任何轉換問題。


注:它可能是您正確保存,但格式化您的查詢的select語句中。在這種情況下,只需不要那樣做;返回日期 - 時間原始數據,並讓接收方客戶擔心如何顯示它。

0

根據您的實際格式,你可以定義一個合適的格式列表,做類似下面

string[] mfs = { "MM/dd/yyyy HH:mm:ss", "MM/dd/yyyy h:mm:ss tt"}; 

var dat = DateTime.ParseExact("04/23/1945 8:45:22 PM", mfs, 
       System.Globalization.CultureInfo.InvariantCulture, 
       System.Globalization.DateTimeStyles.None); 
相關問題