2016-09-29 4 views
4

Я написал программу на C#, которая использует даты. Он принимает значение из таблицы SQL Server. Я использовал Windows 7, и программа работала нормально. Я имел эту строку кода:Невозможно преобразовать DateTime из SQL Server в C# DateTime

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.

И теперь читатель возвращается в утренние часы/P.M. формате, а по индексу 20 - м. или п.м.

Я попытался следующие вещи:

  • перефразируя строку кода:

    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}), или при нажатии:). Это имеет несколько проблем:

  • это занимает больше места
  • не может быть отсортирован правильно/эффективно
  • может не быть проиндексированы правильно/эффективно
  • он не может быть отфильтрован правильно/эффективно
  • это приводит для анализа ошибок между клиентом и сервером
  • имеет все виды проблем локализации и интернационализации

Что вы должны знать, это 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); 
Смежные вопросы