Подтвердить что ты не робот

Что означает временная метка в T-Sql в С#?

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

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

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

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

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

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

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

4b9b3361

Ответ 1

Имя типа данных временной метки сервера Sql запутывает. Это действительно лучше думать об этом больше как номер версии — там нет информации о дате/времени в любом месте. Фактически, с Sql Server 2008 тип был переименован в "rowversion".

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

Если вам действительно нужно сопоставить этот столбец timestamp как есть, то самое близкое совпадение, вероятно, является простым старым long (или, может быть, ulong), но я понятия не имею, как сервер sql обрабатывает порядок байтов или большую/небольшую эндиенцию vs С#.

Ответ 2

Согласно этот пост

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

byte[] dt = dataReader["dt"] as byte[];

Ответ 3

Это a byte[], с Length of 8.

Ответ 4

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

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

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

new SqlParameter("@dt", Convert.FromBase64String(dt))