Что означает отметка времени в T-Sql в C #? - PullRequest
15 голосов
/ 13 июня 2011

Я пытаюсь разработать объект модели для хранения строки сервера Sql, и я прекрасно понимаю, как это сделать, за исключением отметки времени T-Sql / SqlServer.Таблица определяется как:

CREATE TABLE activity (
activity_id int
, ip_address varchar(39)
, user_id varchar(255)
, message_text
, dt timestamp
)

Когда я разрешу строку таблицы в своем объекте, для целого числа или строки я буду ожидать что-то вроде:

ActivityID = (int)dataReader["activity_id"];
IPAddress = (string)dataReader["ip_address"];

Но чтомне делать со столбцом метки времени?Нет такого типа метки времени, который я могу найти где угодно.Я знаю, что Sql Server хранит метку времени в виде 8-байтового двоичного файла, но что это обычно эквивалентно .NET?

Отредактировано, чтобы добавить: Немного дополнительной информации ... этострока, возвращаемая из таблицы DB2 на нашем мэйнфрейме, поступающая через представление Sql Server.«Rowversion» не вариант, и DB2 передает столбец как метку времени.Если временная метка и инверсия строк идентичны, возможно, я могу рассматривать их как единое целое, но в противном случае я застрял с временной меткой.

Еще раз отредактировал, чтобы добавить: Этот проект сводит меня с ума.По крайней мере, это будет короткое путешествие.В любом случае, да @JoelC, это представление Sql Server в базе данных DB2 на мэйнфрейме.Я наконец смог отследить одного из наших администраторов баз данных, который с пренебрежением объяснил, что «конечно» DB2 TIMESTAMP выглядит как Sql Server как datetime.Судя по его тону, только новички этого не знают.Вот почему он назвал это «дата-время» на самом деле, Дух!(Я дал ему другое имя в моем примере, чтобы не вызывать комментарии к соглашениям о присвоении имен - на диаграмме модели данных указано, что это TIMESTAMP, и назвали его меткой времени).Таким образом, в этом случае, очевидно, нужно привести его к DateTime.Я думаю, что могу начать думать о том, чтобы стать администратором, чтобы я тоже мог сводить программистов с ума.Извините, если я ввел в заблуждение любого из ответчиков на этот вопрос - это было непреднамеренно, поскольку я действительно ожидал, что временная метка будет, ну, в общем, временной меткой.Дурак я.Особая благодарность Microsoft за то, что она назвала тип данных байтового массива «меткой времени», когда он не имеет ничего общего с датами и временем.У меня нет смутной идеи, какой ответ пометить как ответ.Вздох.

Ответы [ 4 ]

15 голосов
/ 13 июня 2011

Согласно этому сообщению

вам придется преобразовать его в байтовый массив.

byte[] dt = dataReader["dt"] as byte[];
13 голосов
/ 13 июня 2011

Имя типа метки времени Sql Server сбивает с толку.Это действительно лучше думать о нем, как о номере версии - там нигде нет информации о дате / времени.Фактически, начиная с Sql Server 2008, тип был переименован в «rowversion».

Большую часть времени вам нужен тип datetime в Sql Server, который легко сопоставляется с DateTime в C # или, возможно, datetime2 , если у вас есть версия, поддерживающая Sql Server.,Документация по типу отметки времени приведена здесь:
http://msdn.microsoft.com/en-us/library/ms182776(v=sql.90).aspx

Если вам действительно нужно отобразить этот столбец отметки времени как есть, наиболее близким совпадением может быть просто старое long (или, возможно, ulong), но японятия не имею, как сервер SQL обрабатывает порядок байтов или большой / маленький endis-ness по сравнению с C #.

8 голосов
/ 13 июня 2011

Это byte[], с Length из 8.

3 голосов
/ 11 сентября 2014

при извлечении из базы данных

string dt = Convert.ToBase64String(dataReader["dt"] as byte[]);

при переходе в базу данных

new SqlParameter("@dt", Convert.FromBase64String(dt))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...