2014-10-16 6 views
0

Я получаю значения из моей базы данных, сохраняю их в списке, изменяю значения и обновляю базу данных. Не появляется сообщение об ошибке.mssql datetimeoffset not regonized

Значения в базе данных сохраняются, как это -> "2014-07-11 06: 35: 09.343 +00: 00"

string dateformat = "dd.MM.yyyy HH:mm:ss zzz"; 

foreach (var value in vals) 
{ 
    dt = DateTimeOffset.ParseExact(value[0].ToString(),dateformat, CultureInfo.InvariantCulture); 

    String sqlString = "UPDATE SampleValues " + 
         "SET Value = @VALUE " + 
         "WHERE ID = @ID AND SampleTime = @DATETIME"; 

    var sqlCommand = new SqlCommand(sqlString, connection); 

    sqlCommand.Parameters.Add("@ID", System.Data.SqlDbType.UniqueIdentifier).Value = ID; 
    sqlCommand.Parameters.Add("@DATETIME", System.Data.SqlDbType.DateTimeOffset).Value = dt; 
    sqlCommand.Parameters.Add("@VALUE", System.Data.SqlDbType.NVarChar, int.MaxValue).Value = value[1]; 
    var excuter = sqlCommand.ExecuteNonQuery(); 
} 

Ничто в базе данных не обновляется. Когда значение анализируется dt = {11.07.2014 06:35:09 +00: 00} Когда я изменяю свой строковый формат даты на «yyyy-MM-dd HH: mm: ss zzz» Я получаю сообщение об ошибке. Строка не была признана действительной DateTime. Я также пробовал CAST (@DATETIME как datetimeoffset (7)), ничего не произошло. Тип данных в Дате базы данных datetimeoffset (3)

Любые идеи?

+0

Приложите больше усилий для форматирования кода в будущем. Не было причин, чтобы тело вашей петли было столь массивным отступом. –

+0

Поскольку формат 'yyyy-MM-dd' не соответствует вашей строке' 11.07.2014'. –

+0

Из взгляда предложения WHERE на первый взгляд кажется, что он вряд ли соответствует любым записям, он должен быть точным совпадением на id и полях времени. Вы уверены, что есть какие-то записи, которые точно соответствуют этому. –

ответ

0

В соответствии с предоставленными образцами у вас есть значения в базе данных с точностью до миллисекунды, но вы анализируете значения из строк только с точностью до второй секунды.

2014-07-11 06:35:09.343 +00:00 != 2014-07-11 06:35:09 +00:00 

Они не могут быть равными, поскольку одна сторона имеет разницу в 343 миллисекунды от другой.

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

Затем снова - казалось бы, у вас уже есть идентификатор в вашем месте where. Если это действительно уникальный идентификатор, тогда нет необходимости совпадать с меткой времени.

+0

спасибо, что это сработало для меня. Идентификатор и временная метка являются первичными ключами. Я получаю значения от датчиков в определенные периоды. Поэтому просто совпадение с ID будет означать, что я теряю все значения ... – jonny

Смежные вопросы