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", получавам грешка. Низът не беше разпознат като валидна дата и час. Опитах и ​​CAST(@DATETIME като 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 изглежда малко вероятно да съвпадне с някакви записи, трябва да е точно съвпадение на id и полетата sampletime. Сигурни ли сте, че има някакви записи, които отговарят точно на това?   -  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 милисекунди разлика от другата.

Като цяло не е добра идея да съпоставяте времеви клейма с толкова фина точност, като използвате точно равенство. Вместо това помислете за съвпадение на диапазон. Ако знаете, че имате стойности за цялата секунда, можете да съпоставите стойности >= началото на цялата секунда и ‹ началото на следващата цяла секунда.

След това отново - изглежда, че вече имате ID във вашата клауза where. Ако това наистина е уникален идентификатор, тогава изобщо няма нужда да съвпадате с времевия печат.

person Matt Johnson-Pint    schedule 20.10.2014
comment
благодаря, това свърши работа за мен. Идентификаторът и клеймото за време са първичните ключове. Получавам стойности от сензори в определени периоди. Така че просто съпоставяне на ID би означавало, че губя всички стойности ... - person jonny; 21.10.2014