How to read timestamp type's data from sql server using C#?

18,760

Solution 1

If you just want to convert byte[] to a System.Int64 (aka long) then use BitConverter.ToInt64:

SqlBinary binary = /* ... */;
long value = BitConverter.ToInt64(binary.Value, 0); // 0 is the start index in the byte array

To display it as a hex string, you can use the X format specifier, e.g.:

Console.WriteLine("Value is 0x{0:X}.", value);

Solution 2

I found that the byte[] returned from sql server had the wrong Endian-ness and hence the conversion to long (Int64) did not work correctly. I solved the issue by calling Reverse on the array before passing it into BitConverter:

byte[] byteArray = {0, 0, 0, 0, 0, 0, 0, 8};

var value = BitConverter.ToUInt64(byteArray.Reverse().ToArray(), 0);

Also, I thought it better to convert to UInt64.

Solution 3

Here's an one-liner:

var byteArray = new byte[] { 0, 0, 0, 0, 0, 0, 30, 138 };

var rowVersion = "0x" + string.Concat(Array.ConvertAll(byteArray, x => x.ToString("X2")));

The result is:

"0x0000000000001E8A"

Just be aware that there are other options that perform better.

Share:
18,760
user980447
Author by

user980447

Updated on June 05, 2022

Comments

  • user980447
    user980447 about 2 years

    I get the result in .NET like this:

    var lastRowVersion = SqlHelper.ExecuteScalar(connStr, CommandType.Text, "select
    top 1 rowversion from dbo.sdb_x_orginfo order by rowversion desc");
    

    The result is a byte array [0]= 0,[1]=0,[2]=0,[3]=0,[4]=0,[5]=0,[6]=30,[7]=138, but the result in SQL Server is 0x0000000000001E8A.

    How can I get the value "0x0000000000001E8A" in .NET?

  • mcw
    mcw over 10 years
    See the other answer - SqlBinary.Value has the opposite endianness, so you most likely want to reverse the bytes.
  • Snixtor
    Snixtor over 9 years
    Be aware that bigint is a 64bit signed integer, whereas rowversion is a 64bit unsigned integer. Given a large enough rowversion value, casting to bigint will give unexpected results.