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

时间:2010-04-19 13:30:18

标签: c# .net oracle ado.net guid

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

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

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

.NET Native GUID conversion

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

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

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

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

史蒂夫

答案 2 :(得分:0)

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

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

可能完全与倒车一样简单,但是 - 您可能需要进行更详细的交换。我建议你创建一个GUID,每个字节很容易识别(使用0x01,0x23,0x45等)并从那里开始工作。