【问题标题】:Convert byte array from Oracle RAW to System.Guid?将字节数组从 Oracle RAW 转换为 System.Guid?
【发布时间】:2011-02-09 16:44:42
【问题描述】:

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

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

【问题讨论】:

  • 您是否有任何 GUID 在存储之前的示例以及存储时的值?
  • 您是否将 guid 保存为 oracle 中的字节数组?

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


【解决方案1】:

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

我仍然不知道为什么字节是这样排序的,但它显然与 Oracle 无关。

【讨论】:

【解决方案2】:

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

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

.NET Native GUID conversion

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

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

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

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

史蒂夫

【讨论】:

    【解决方案3】:

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

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

    它可能不像倒车那么简单完全 - 您可能需要进行更详细的交换。我建议您创建一个 GUID,其中每个字节都易于识别(使用 0x01、0x23、0x45 等)并从那里开始工作。

    【讨论】:

    • 感谢您的回答。这不太对,因为我问错了问题。不过,您的建议确实让我得到了正确的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多