将字节数组从Oracle RAW转换为System.Guid?

我的应用程序使用DataReader在ADO.NET中编写的自定义数据访问层与Oracle和SQL Server数据库进行交互。 现在我遇到了GUID(我们用于主键)和Oracle RAW数据类型之间转换的问题。 插入oracle很好(我只是在System.Guid上使用ToByteArray()方法)。 当我从数据库加载记录时,问题是转换回System.Guid。 目前,我正在使用从ADO.NET获得的字节数组传递给System.Guid的构造函数。 这似乎有效,但数据库中出现的Guid与我以这种方式生成的Guids不对应。

我无法更改数据库架构或查询(因为它重用于SQL Server)。 我需要代码将Oracle中的字节数组转换为正确的Guid。

事实certificate,问题是你在Guid.ToByteArray()获得的字节顺序而不是Oracle本身。 如果您使用Guid“ 11223344-5566-7788-9900-aabbccddeeff ”并在其上调用ToByteArray() ,则会获得“ 44332211665588779900AABBCCDDEEFF ”。 如果然后将该字节数组传递回Guid的构造函数,则会获得原始Guid。 我的错误是尝试通过原始Guid格式(删除破折号)查询Oracle数据库,而不是ToByteArray()调用的结果。

我仍然不知道为什么字节按这种方式排序,但它显然与Oracle无关。

从Oracle存储和读取Guids时,我遇到了同样的问题。

如果您的应用需要存储和读取Oracle中的Guids,请使用此线程中的FlipEndian函数:

.NET Native GUID转换

 Byte[] rawBytesFromOracle; Guid dotNetGuid = new Guid(rawBytesFromOracle).FlipEndian(); 

只有在从Oracle回读时才需要翻转。

写入Oracle时,正常使用Guid.ToByteArray()。

我花了太多时间试图完成这个简单的任务。

史蒂夫

我有一些模糊的回忆,与.NET预期的顺序相比,Oracle的GUID被有效地逆转了。

尝试在调用Guid构造函数之前反转数组。

然而,它可能不像倒车那么简单 – 您可能需要进行更详细的交换。 我建议你创建一个GUID,每个字节很容易识别(使用0x01,0x23,0x45等)并从那里开始工作。