2015-06-24 2 views
0

Для начала, ошибка я получаю следующим образом:Casting SQL Дата валютирования с помощью Convert.ToDateTime в C# не удается

Преобразование типа VARCHAR данных в тип данных даты и времени в результате Аут - значение диапазона.

Что я сделал возвращается набор данных из базы данных SQL в DataTable, оттуда я бегу в if заявление на С # стороне кода, чтобы определить, является ли одна дата больше другой. Это работало на многочисленных развертываниях, однако конкретное развертывание на новом сервере приводит к вышеуказанной ошибке.

Вот мой код:

if 
(
    Convert.ToDateTime(ds.Tables[0].Rows[0]["StartDate"].ToString()).Date > 
    Convert.ToDateTime(ds.Tables[0].Rows[0]["OriginalStartDate"].ToString()).Date 
) 
{ 
    ... do stuff ... 
} 

Я понимаю, что данные внутри колонны, преобразуется в строку, не удается при попытке выполнить Convert.ToDateTime()

недоумение вопрос, однако, что это код работал на других серверах, и этот вопрос изолирован. Поэтому я понимаю, что он может быть уникальным для сервера, но я не знаю, где искать.

Изменение каких-либо региональных настроек и т. Д., К сожалению, не является вариантом, поэтому я пытаюсь найти способ обойти это!

Любая помощь приветствуется!

+0

Что такое формат дат в базе данных? Вероятно, даты записываются в одном формате, а ваше преобразование выполняется в другом. – MPelletier

+1

Что такое * type * в базе данных? Это должен быть DateTime, что означает, что вы не должны конвертировать в строку и обратно вообще. Просто используйте 'if ((DateTime) ds.Tables [0] .Rows [0] [" StartDate "]> (DateTime) ds.Tables [0] .Rows [0] [" OriginalStartDate "]))' –

+0

Двойная проверка 'type' оба поля имеют тип DateTime. @JonSkeet. Я попробую ваше предложение. Что касается формата, это выглядит как '2015-07-01 00: 00: 00.000' @MPelletier –

ответ

3

В принципе, вы не должны преобразовывать значения в строки и обратно в первую очередь. По возможности избегайте преобразования строк, если это не является существенной частью того, что вы пытаетесь сделать. В вашем случае вы действительно заинтересованы в значениях DateTime. Они DateTime в базе данных, и вы хотите, чтобы они как DateTime значений в вашем коде, так зачем вводить строки?

Вы должны быть в состоянии использовать:

DataRow row = ds.Tables[0].Rows[0]; 
DateTime startDate = (DateTime) row["StartDate"]; 
DateTime originalStartDate = (DateTime) row["OriginalStartDate"]; 
if (startDate.Date > originalStartDate.Date) 
{ 
    ... 
} 
+0

Спасибо, Джон. 100% здесь. Я понял, что на базе я пытался сократить некоторые углы, которые только что вызвали у меня головную боль, и, конечно, преобразование строк было ненужным. Спасибо за понимание. Оценил. –

0

Возможно, вы можете попробовать это?

 if (Convert.ToDateTime(ds.Tables[0].Rows[0]["StartDate"].ToString("yyyyMMdd HH:mm:ss")).Date > Convert.ToDateTime(ds.Tables[0].Rows[0]["OriginalStartDate"].ToString("yyyyMMdd HH:mm:ss")).Date) 
     { 
       ...do stuff... 
     } 
Смежные вопросы