12

次のように.NETで結果を取得します。

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

結果はバイト配列[0]= 0,[1]=0,[2]=0,[3]=0,[4]=0,[5]=0,[6]=30,[7]=138ですが、SQL Server での結果は0x0000000000001E8A.

"0x0000000000001E8A".NETで値を取得するにはどうすればよいですか?

4

6 に答える 6

24

SQL Server から返された byte[] のエンディアンが正しくないため、long (Int64) への変換が正しく機能しないことがわかりました。BitConverter に渡す前に、配列で Reverse を呼び出して問題を解決しました。

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

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

また、UInt64に変換した方が良いと思いました。

于 2013-01-24T23:56:44.427 に答える
5

(別名)に変換するだけの場合は、次を使用byte[]します。System.Int64longBitConverter.ToInt64

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

16 進文字列として表示するには、次のようにX 書式指定子を使用できます。

Console.WriteLine("Value is 0x{0:X}.", value);
于 2011-11-08T06:35:14.750 に答える
0

「Ashish Singh」と同じく、DB で bigint に変換してから c# に戻し、コード側で Int64 を使用しました。c#/VB で long/Int64/UInt64 に変換すると、間違った結果が得られました (リトル エンディアンの問題のために配列を逆にした後でも)。

RowVersion タイムスタンプには、最後にコミットされたタイムスタンプを示す MIN_ACTIVE_ROWVERSION() があることに DB 側で注意してください。

于 2015-03-03T13:14:56.680 に答える