2010-04-19 30 views
8

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

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

+0

您是否有存储GUID的任何示例以及存储时的值? – Richard 2010-04-19 13:33:42

+0

您是否将oracle保存为oracle中的字节数组? – Peter 2010-04-19 13:36:47

回答

4

事实证明,问题是您在Guid.ToByteArray()中获得的字节顺序,而不是Oracle本身。如果您采用Guid“11223344-5566-7788-9900-aabbccddeeff”并致电ToByteArray()就可以得到“44332211665588779900AABBCCDDEEFF”。如果您将该字节数组传回到Guid的构造函数中,您将获得原始的Guid。我的错误是试图通过原始Guid格式(删除破折号)来查询Oracle数据库,而不是调用ToByteArray()的结果。

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

+0

这就是为什么..... http://stackoverflow.com/questions/9195551/why-does-guid-tobytearray-order-the-bytes-the-way-it-does – samneric 2015-10-06 13:44:21

0

我有模糊的记忆,Oracle的GUID与.NET预期的顺序相比被有效地颠倒过来。

尝试在调用Guid构造函数之前颠倒数组。

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

+0

感谢您的回答。这是不正确的,因为我问的是错误的问题。不过,你的建议确实让我得到了正确的答案。 – 2010-04-23 16:43:47

3

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

如果您的应用需要存储和读出甲骨文的GUID,使用FlipEndian功能,从这个线程:

.NET Native GUID conversion

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

翻转阅读从Oracle回来的时候,才需要。

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

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

Steve