2011-06-13 7 views
10

Estoy tratando de desarrollar un objeto modelo para contener una fila de servidor Sql, y entiendo perfectamente cómo hacer esto a excepción de la marca de tiempo T-Sql/SqlServer. La mesa se define como:¿Qué significa una marca de tiempo en T-Sql en C#?

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

Cuando resuelvo una fila de tabla a mi objeto, por un int o una cadena que se puede esperar para hacer algo como:

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

Pero, ¿qué puedo hacer al respecto la columna de la marca de tiempo? No hay ningún tipo de datos de "marca de tiempo" que pueda encontrar en ningún lado. Sé que el servidor Sql almacena la marca de tiempo como un binario de 8 bytes, pero ¿en qué es normalmente equivalente en .NET?

Editado para agregar: Un poco de información adicional ... esta es una fila que se devuelve de una tabla de DB2 en nuestro mainframe que viene a través de una vista de servidor Sql. "Rowversion" no es una opción, y DB2 está entregando la columna como una marca de tiempo. Si la marca de tiempo y la versión de la fila son idénticas, tal vez pueda tratarlo como si fuera uno, pero de lo contrario estoy atascado con la marca de tiempo.

Editado de nuevo para agregar: Este proyecto me va a volver loco. Será, al menos, un viaje corto. De todos modos, sí @JelC esta es una vista de servidor Sql en una base de datos DB2 en el mainframe. Finalmente pude rastrear uno de nuestros DBA, quien explicó con desdén que "por supuesto" un DB2 TIMESTAMP aparece como una vista de servidor Sql como una fecha y hora. Por su tono de voz, supongo que solo los noobs no saben esto. Es por eso que lo llamó "fecha y hora" en la vista real, ¡Duh! (Le puse un nombre diferente en mi ejemplo para no generar comentarios sobre las convenciones de nomenclatura; el diagrama del modelo de datos real dice que es un TIMESTAMP y lo nombra marca de tiempo). Entonces, en este caso, aparentemente uno debe convertirlo a DateTime. Creo que puedo comenzar a considerar convertirme en DBA para que yo también pueda volver locos a los programadores. Lo siento si confundí a alguno de los que respondieron a esta pregunta, no fue intencional, ya que en realidad estaba esperando que una marca de tiempo fuera, bueno, una marca de tiempo. Tonto de mí. Gracias especialmente a Microsoft por nombrar un tipo de datos de matriz de bytes una "marca de tiempo" cuando no tiene nada que ver con las fechas y horas. No tengo la menor idea de qué respuesta marcar como la Respuesta. Suspiro.

+0

@ Michael que no es lo que se le preguntó OP. Utilizaría DateTime, BTW –

+0

¿Qué pasa con el objeto 'DateTime', puede contener su marca de tiempo. – Rahul

+0

vea también: http://stackoverflow.com/questions/425389/c-equivalent-of-sql-server-2005-datatypes –

Respuesta

10

El nombre del tipo de datos de marca de hora del servidor Sql es confuso. Realmente es mejor pensar que es más como un número de versión —, no hay información de fecha/hora en ninguna parte. De hecho, desde Sql Server 2008 el tipo fue renombrado como "rowversion".

mayoría de las veces desea que el tipo datetime en SQL Server lugar, que los mapas fácilmente a DateTime en C#, o tal vez datetime2 si tiene una versión de lo que SQL Server que lo soporta. Documentación sobre el tipo de marca de tiempo está aquí:
http://msdn.microsoft.com/en-us/library/ms182776(v=sql.90).aspx

Si realmente debe asignar esa columna de marca de tiempo tal y como son, la coincidencia más cercana es probablemente el viejo y simple long (o tal vez ulong), pero no tengo ni idea de cómo SQL asas servidor orden de bytes o gran/pequeño endien-ness vs C#.

+1

Voy a marcar esto como la respuesta aceptada, porque es la respuesta correcta en respuesta a lo que yo pensaba que era la pregunta. La pregunta se ha vuelto diferente porque mi suposición subyacente era incorrecta, las respuestas que dicen que lanzar a DateTime son correctas en esa instancia. – Cyberherbalist

13

Según this post

tendrá que echarlo a una matriz de bytes.

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

Es un byte[], con un Length de 8.

2

al recuperar la base de datos

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

al pasar en base de datos

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