将来自Oracle RAW的字节数组转换为System.Guid?

12
我的应用程序使用自定义的数据访问层,使用ADO.NET和DataReaders与Oracle和SQL Server数据库进行交互。现在我遇到了一个问题,就是GUID(我们用作主键)和Oracle RAW数据类型之间的转换问题。插入到Oracle中没有问题(我只需使用System.Guid的ToByteArray()方法即可)。问题在于从数据库加载记录时将其转换回System.Guid。目前,我正在使用从ADO.NET获取的字节数组传递给System.Guid的构造函数。这似乎有效,但是以这种方式生成的Guids与数据库中出现的Guids不对应。
我无法更改数据库架构或查询(因为它被重用于SQL Server)。我需要编写代码将来自Oracle的字节数组转换为正确的Guid。

你有GUID存储前的示例以及存储时的值吗? - Richard
你是否将GUID保存为Oracle中的字节数组? - Peter
3个回答

7
事实证明,问题出在Guid.ToByteArray()返回的字节顺序上,而不是Oracle本身。如果您使用Guid "11223344-5566-7788-9900-aabbccddeeff" 并对其调用ToByteArray(),则会得到"44332211665588779900AABBCCDDEEFF"。如果您将该字节数组传回Guid构造函数,则会得到原始的Guid。我的错误在于尝试按原始的Guid格式(去除破折号)查询Oracle数据库,而不是ToByteArray()调用的结果。
我仍然不知道为什么字节会以那种方式排序,但显然与Oracle无关。

这就是为什么 GUID.ToByteArray() 方法按照特定的顺序排列字节的原因。 - samneric

5

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

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

.NET原生GUID转换

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

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

写入Oracle时,请像平常一样使用Guid.ToByteArray()。

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

史蒂夫


1

我模糊地记得,相比.NET期望的顺序,Oracle的GUID实际上是反过来的。

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

然而,这可能不是那么简单 - 你可能需要进行更详细的交换。我建议你创建一个每个字节都容易识别的GUID(使用0x01、0x23、0x45等),然后从那里开始工作。


谢谢你的回答。虽然我的问题问错了,但是你的建议确实帮我找到了正确的答案。 - Cory McCarty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接