mssql datetimeoffset не переопределен

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

Значения в базе данных сохраняются следующим образом -> "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} Когда я меняю формат даты строки на «гггг-ММ-дд ЧЧ: мм: сс zzz», я получаю сообщение об ошибке. Строка не была распознана как допустимый DateTime. Я также попробовал CAST(@DATETIME as datetimeoffset(7)) ничего не произошло. Тип даты в базе данных - datetimeoffset(3)

Любые идеи?


person jonny    schedule 16.10.2014    source источник
comment
Пожалуйста, приложите больше усилий для форматирования вашего кода в будущем. Не было никакой причины для того, чтобы тело вашего цикла было таким массивным отступом.   -  person Jon Skeet    schedule 16.10.2014
comment
Поскольку формат yyyy-MM-dd не соответствует вашей строке 11.07.2014.   -  person Soner Gönül    schedule 16.10.2014
comment
Судя по внешнему виду предложения WHERE, маловероятно, что оно соответствует каким-либо записям, это должно быть точное совпадение в полях идентификатора и времени выборки. Вы уверены, что есть записи, точно соответствующие этому?   -  person Ben Robinson    schedule 16.10.2014
comment
Я собираю все свои значения из одной и той же таблицы и обновляю их, когда значение корректируется.   -  person jonny    schedule 16.10.2014


Ответы (1)


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

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

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

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

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

person Matt Johnson-Pint    schedule 20.10.2014
comment
спасибо, это сработало для меня. Идентификатор и метка времени являются первичными ключами. Я получаю значения от датчиков в определенные периоды. Таким образом, простое сопоставление идентификатора будет означать, что я потеряю все значения... - person jonny; 21.10.2014